vickzhu

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            151 隨筆 :: 0 文章 :: 34 評(píng)論 :: 0 Trackbacks

          #

          posted @ 2009-03-12 10:37 筱 筱 閱讀(199) | 評(píng)論 (0)編輯 收藏

          Hibernate支持第三方的連接池,官方推薦的連接池是C3P0,Proxool,以及DBCP。在配置連接池時(shí)需要注意的有三點(diǎn):
            一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已經(jīng)不再推薦使用,官方的解釋是這個(gè)連接池存在缺陷。如果你因?yàn)槟撤N原因需要在Hibernate3中使用DBCP,建議采用JNDI方式。
            二、默認(rèn)情況下(即沒(méi)有配置連接池的情況下),Hibernate會(huì)采用內(nèi)建的連接池。但這個(gè)連接池性能不佳,且存在諸多BUG,因此官方也只是建議僅在開(kāi)發(fā)環(huán)境下使用。
            三、Hibernate2和Hibernate3的命名空間有所變化。例如,配置C3P0時(shí)的provider_class有Hibernate2環(huán)境下使用net.sf.hibernate.connection.C3P0ConnectionProvider,在Hibernate3環(huán)境下使用org.hibernate.connection.C3P0ConnectionProvider。
            下面是Hibernate環(huán)境下幾種常見(jiàn)的連接池配置,都是以連接MySQl為例。
            <!-- JDBC驅(qū)動(dòng)程序 -->
            <property name="connection.driver_class">org.gjt.mm.mysql.Driver</property>
            <property name="connection.url">jdbc:mysql://localhost:3306/struts?useUnicode=true
            & characterEncoding=GBK</property>
            <!-- 數(shù)據(jù)庫(kù)用戶名 -->
            <property name="connection.username">root</property>
            <!-- 數(shù)據(jù)庫(kù)密碼 -->
            <property name="connection.password">8888</property>
            上面的一段配置,在c3p0和dbcp中,都是必需的,因?yàn)閔ibernate會(huì)根據(jù)上述的配置來(lái)生成connections,再交給c3p0或dbcp管理。但是proxool則不能,可以讓proxool自身來(lái)生成連接,這在下面再講。
            從網(wǎng)上google了一下,發(fā)現(xiàn)大致有三種可以實(shí)施的解決方案:
            1、使用hibernate自帶的連接池;
            2、使用c3po包的連接池功能;
            3、使用dbcp包的連接池功能;
            4、使用Proxool包的連接池功能;
                  5、使用JNDI連接池
            第一種方案,Hibernate默認(rèn)連接池,就是在myeclipse產(chǎn)生的hibernate.cfg.xml中添加一個(gè)屬性:
            <property name="connection.pool_size">20</property>
            第二種方案是:C3P0
            只需在hibernate.cfg.xml中加入
            <property name="c3p0.min_size">2</property>
            <property name="c3p0.max_size">10</property>
            <property name="c3p0.timeout">1800</property>
            <property name="c3p0.acquireRetryAttempts">4</property>
            <property name="c3p0.acquireIncrement">1</property>
            <property name="c3p0.idleConnectionTestPeriod">36000</property>
            <property name="c3p0.initialPoolSize">2</property>
            <property name="c3p0.maxPoolSize">10</property>
            <property name="c3p0.maxIdleTime">1200</property>
            <property name="c3p0.maxStatements">30</property>
            <property name="c3p0.minPoolSize">2</property>
            <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
            還有在classespath中加入c3p0-0.8.4.5.jar
            第三種方案是:dbcp
            在hibernate.cfg.xml中加入
            <property name="dbcp.maxActive">100</property>
            <property name="dbcp.whenExhaustedAction">1</property>
            <property name="dbcp.maxWait">60000</property>
            <property name="dbcp.maxIdle">10</property>
            <property name="dbcp.ps.maxActive">100</property>
            <property name="dbcp.ps.whenExhaustedAction">1</property>
            <property name="dbcp.ps.maxWait">60000</property>
            <property name="dbcp.ps.maxIdle">10</property>
            還有在classespath中加入commons-pool-1.2.jar 和commons-dbcp-1.2.1.jar.
            第四種方案是:Proxool
            建立一個(gè)Proxool.xml文件:
            <?xml version="1.0" encoding="UTF-8"?>
            <!-- the proxool configuration can be embedded within your own application’s.
            Anything outside the "proxool" tag is ignored. -->
            <something-else-entirely>
            <proxool>
            <alias>
            mysql
            </alias>
            <driver-url>
            jdbc:mysql://localhost:3306/jackdemo
            </driver-url>
            <driver-class>
            com.mysql.jdbc.Driver
            </driver-class>
            <driver-properties>
            <property name="user" value="root" />
            <property name="password" value="jack" />
            </driver-properties>
            <house-keeping-sleep-time>
            60000
            </house-keeping-sleep-time>
            <proxool.simultaneous-build-throttle>
            100
            </proxool.simultaneous-build-throttle>
            <prototype-count>
            2
            </prototype-count>
            <maximum-connection-count>
            100
            </maximum-connection-count>
            <minimum-connection-count>
            10
            </minimum-connection-count>
            </proxool>
            </something-else-entirely>
            現(xiàn)在來(lái)看下配置的意思:
            <alias>配置連接池的別名;
            <driver-url>和寫(xiě)JDBC連接數(shù)據(jù)庫(kù)時(shí)的URL一樣。
            <driver-class>和寫(xiě)JDBC連接數(shù)據(jù)庫(kù)時(shí)的Driver一樣。
            <driver-properies>就是連接數(shù)據(jù)庫(kù)時(shí)的用戶名和密碼。
            <house-keeping-sleep-time>proxool自動(dòng)偵察各個(gè)連接狀態(tài)的時(shí)間間隔(毫秒),偵察到空閑的連接就馬上回收,超時(shí)的銷(xiāo)毀
            <prototype-count>最少保持的空閑連接數(shù)
            <maximum-connection-count>最大連接數(shù)。
            <minimum-connection-count>最小連接數(shù)。
            以下是在Hibernate配置文件中對(duì)連接池的配置:
            <?xml version=’1.0’ encoding=’UTF-8’?>
            <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
            <hibernate-configuration>
            <session-factory>
            <!-- proxool連接池加載的類(lèi)-->
            <property name="hibernate.connection.provider_class">
            org.hibernate.connection.ProxoolConnectionProvider
            </property>
            <!--連接池的別名,即配置連接池時(shí)起的別名-->
            <property name="hibernate.proxool.pool_alias">
            mysql
            </property>
            <!--連接池文件的地址-->
            <property name="hibernate.proxool.xml">
            config/proxool/proxool.xml
            </property>
            <!--是否將運(yùn)行期生成的SQL輸出到日志以供調(diào)試-->
            <property name="show_sql">true</property>
            <mapping resource="com/jack/ssh/demo/bo/City.hbm.xml" />
            <mapping resource="com/jack/ssh/demo/bo/Province.hbm.xml" />
            </session-factory>
            </hibernate-configuration>
            第五種方案是:JNDI連接池。數(shù)據(jù)源已經(jīng)由應(yīng)用服務(wù)配置好(如Web服務(wù)器),Hibernate需要做的只是通過(guò)JNDI名查找到此數(shù)據(jù)源。應(yīng)用服務(wù)器將連接池對(duì)外顯示為JNDI綁定數(shù)據(jù)源,它是javax.jdbc.Datasource類(lèi)的一個(gè)實(shí)例。只要配置一個(gè)Hibernate文件,如:
            hibernate.connection.datasource = java:/comp/env/jdbc/portal //JNDI名
            hibernate.transaction.factory_class = org.hibernate.transaction.JTATransactionFactory
            hibernate.transaction.manager_loopup_class = org.hibernate.transaction.JBossTransactionManagerLookup
            hibernate.dialect = org.hibernate.dialect.MySQLDialect。
          posted @ 2009-03-10 09:23 筱 筱 閱讀(495) | 評(píng)論 (0)編輯 收藏

          Name Lession Mark
          Amy Chinese 89
          Amy Math 59
          Amy History 87
          Amy Japanese 77
          Alan Math 54
          Alan Chinese 83
          Alan History 86
          Alan Japanese 76
          Bruce History 83
          Bruce Math 58
          Bruce Japanese 82
          Alisa Math 59


          1. 請(qǐng)查詢(xún)出學(xué)生出姓名mark<60
          2. 請(qǐng)查詢(xún)每門(mén)學(xué)科中存在有一門(mén)不及格的學(xué)生姓名
          3. 請(qǐng)查詢(xún)出各科總分排行前三名的學(xué)生姓名和成績(jī)(包含并列)
          4. 請(qǐng)查詢(xún)出每門(mén)科目中前三名的學(xué)生姓名和科目(包含并列的)




          posted @ 2009-02-25 20:32 筱 筱 閱讀(250) | 評(píng)論 (0)編輯 收藏

          <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id=scriptmain name=scriptmain codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="560" height="176">
                 <param name="movie" value="/images/bcastr.swf?bcastr_xml_url=/pages/web/xml/bcastr.xml" />
                 <param name="quality" value="high" />
                 <param name=scale value=noscale />
                 <param name="LOOP" value="false" />
                 <param name="menu" value="false" />
                 <param name="wmode" value="transparent" />
                 <embed src="/images/bcastr.swf?bcastr_xml_url=/pages/web/xml/bcastr.xml" width="560" height="176" loop="false" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" salign="T" name="scriptmain" menu="false" wmode="transparent"></embed>
          </object>

          <?xml version="1.0" encoding="utf-8"?>
          <bcaster autoPlayTime="5">
          <item item_url="flash圖片" link="鏈接路徑" >
          </item>
          <item item_url="flash圖片" link="鏈接路徑" >
          </item>
          </bcaster>
          posted @ 2009-02-17 09:36 筱 筱 閱讀(168) | 評(píng)論 (0)編輯 收藏

          困擾我多年的sql語(yǔ)句執(zhí)行順序今天終于在網(wǎng)上找到了
          1. 先where 后select
          2. 先where 再group 再having 后select
          3. 先where 再group 再having 再order 后select
          4. 先join 再where 后select
          例:select top 3 name from student group by name order by sum(mark) desc
              (查詢(xún)班上總分排名前三的學(xué)生姓名)
          開(kāi)心啦,開(kāi)心!
          posted @ 2009-02-03 16:31 筱 筱 閱讀(275) | 評(píng)論 (0)編輯 收藏

          1,load()方法從來(lái)就是假定數(shù)據(jù)在數(shù)據(jù)庫(kù)中是存在的,在使用時(shí)如果不存在則會(huì)拋出ObjectNotFoundException;而get()方法不會(huì)假定數(shù)據(jù)在數(shù)據(jù)庫(kù)中存在,如果不存在則返回null
          2,load()方法返回的是實(shí)體類(lèi)的代理類(lèi),因此load()可以使用延遲加載策略來(lái)加載對(duì)象
                get()方法返回的不一定是實(shí)體類(lèi),可能是代理類(lèi),因?yàn)間et()方法如果在session緩存(一級(jí)緩存)中找到了該id對(duì)應(yīng)的對(duì)象,如果剛好該對(duì)象前面是被代理過(guò)的,如被load方法使用過(guò),或者被其他關(guān)聯(lián)對(duì)象延遲加載過(guò),那么返回的還是原先的代理對(duì)象,而不是實(shí)體類(lèi)對(duì)象。
          3,load()方法查詢(xún)數(shù)據(jù)時(shí)會(huì)先從session緩存(一級(jí)緩存)中查找,如果沒(méi)有找到則會(huì)創(chuàng)建代理類(lèi),該代理類(lèi)僅僅初始化了OID屬性,當(dāng)?shù)谝淮卧L問(wèn)其他屬性值時(shí),則會(huì)依次從二級(jí)緩存-->數(shù)據(jù)庫(kù)查找,直到找到數(shù)據(jù),最后將所有屬性值賦給代理類(lèi)。而get()方法則會(huì)直接按照一級(jí)緩存-->二級(jí)緩存-->數(shù)據(jù)庫(kù)的順序查找。

          看到網(wǎng)上的全都是復(fù)制的,而且錯(cuò)誤不少,怎么就沒(méi)有人修正一下呢?
          posted @ 2009-01-22 10:29 筱 筱 閱讀(491) | 評(píng)論 (0)編輯 收藏

          HTTP頭中一般斷點(diǎn)下載時(shí)才用到Range和Content-Range實(shí)體頭,
          Range用戶請(qǐng)求頭中,指定第一個(gè)字節(jié)的位置和最后一個(gè)字節(jié)的位置,如(Range:200-300)
          Content-Range用于響應(yīng)頭

          請(qǐng)求下載整個(gè)文件:
          ***********************************
          GET  /test.rar  HTTP/1.1
          Connection:  close
          Host:  116.1.219.219
          Range:  bytes=0-100
          ***********************************
          Range頭域可以請(qǐng)求實(shí)體的一個(gè)或者多個(gè)子范圍,Range的值為0表示第一個(gè)字節(jié),也就是Range計(jì)算字節(jié)數(shù)是從0開(kāi)始的
          表示頭500個(gè)字節(jié):bytes=0-499
          表示第二個(gè)500字節(jié):bytes=500-999
          表示最后500個(gè)字節(jié):bytes=-500
          表示500字節(jié)以后的范圍:bytes=500-
          第一個(gè)和最后一個(gè)字節(jié):bytes=0-0,-1
          同時(shí)指定幾個(gè)范圍:bytes=500-600,601-999


          一般正常回應(yīng)
          ***********************************
          HTTP/1.1 206 OK
          Content-Length:  801     
          Content-Type:  application/octet-stream 
          Content-Location: http://www.onlinedown.net/hj_index.htm
          Content-Range:  bytes  0-100/2350 //2350:文件總大小
          Last-Modified: Mon, 16 Feb 2009 16:10:12 GMT
          Accept-Ranges: bytes
          ETag: "d67a4bc5190c91:512"
          Server: Microsoft-IIS/6.0
          Date: Wed, 18 Feb 2009 07:55:26 GMT
          ***********************************

          注意:如果用戶的請(qǐng)求中含有range ,則服務(wù)器的相應(yīng)代碼為206。
          206 - Partial Content 客戶發(fā)送了一個(gè)帶有Range頭的GET請(qǐng)求,服務(wù)器完成了它(HTTP 1.1新)。
          posted @ 2009-01-21 17:48 筱 筱 閱讀(4371) | 評(píng)論 (0)編輯 收藏

                  最近我們公司的jsp網(wǎng)站要和另一家公司的asp網(wǎng)站做通訊,之間通過(guò)xml傳遞信息
                  現(xiàn)假如我們公司是A,對(duì)方公司是B,如果A發(fā)送一條信息給B,B必須反饋一條信息表示是否執(zhí)行成功。這里有兩種模式可以使用,
              第一:A、B把對(duì)方都當(dāng)做服務(wù)器進(jìn)行消息發(fā)送
              第二:A相當(dāng)于瀏覽器、B相當(dāng)于服務(wù)器,A發(fā)送一個(gè)消息給B,B直接返回給A信息。
              下面我們來(lái)看看這兩種方式分別怎么實(shí)現(xiàn)?
              第一種:
                  1、A(a.jsp)的代碼:
                  StringBuffer sb=new StringBuffer("<?xml version=\"1.0\" encoding=\"GBK\"?>");
                  sb.append("<User>");
                  sb.append("<HEAD>");
                  sb.append("<SUCCESS></SUCCESS>");
                  sb.append("</HEAD>");
                  sb.append("<BODY>");
                  sb.append("<MOBILE></MOBILE>");
                  sb.append("<NAME></NAME>");
                  sb.append("<SEX></SEX>");
                  sb.append("</BODY>");
                  sb.append("</User>");
                  URL url = new URL("B服務(wù)器的接收路徑");
                  HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                  conn.setRequestProperty("Content-Type", "text/xml;charset=gbk");
                  conn.setRequestMethod("POST");
                  conn.setRequestProperty("Content-Length", String.valueOf(xml.length()));
                  conn.setConnectTimeout(5000);
                  conn.setDoOutput(true);
                  OutputStream os = conn.getOutputStream();
                  os.write(sb.toString().getBytes());
                  os.flush();
                  os.close();
                  2、B服務(wù)器接收到A的請(qǐng)求后,也以類(lèi)似于1(當(dāng)然asp中的代碼我不知道怎么寫(xiě))將反饋信息發(fā)送到A的指定路徑(b.jsp)
                  3、A(b.jsp)接收B的反饋信息:
                      InputStream is=request.getInputStream();
              第二種:
                  1、A(a.jsp)的代碼
                      StringBuffer sb=new StringBuffer("<?xml version=\"1.0\" encoding=\"GBK\"?>");
                      sb.append("<User>");
                      sb.append("<HEAD>");
                      sb.append("<SUCCESS></SUCCESS>");
                      sb.append("</HEAD>");
                      sb.append("<BODY>");
                      sb.append("<MOBILE></MOBILE>");
                      sb.append("<NAME></NAME>");
                      sb.append("<SEX></SEX>");
                      sb.append("</BODY>");
                      sb.append("</User>");
                      URL url = new URL("B服務(wù)器的接收路徑");
                      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                      conn.setRequestProperty("Content-Type", "text/xml;charset=gbk");
                      conn.setRequestMethod("POST");
                      conn.setRequestProperty("Content-Length", String.valueOf(xml.length()));
                      conn.setConnectTimeout(5000);
                      conn.setDoOutput(true);
                      OutputStream os = conn.getOutputStream();
                      os.write(sb.toString().getBytes());
                      os.flush();
                      os.close();
                  2、B接收到A(a.jsp)服務(wù)器的代碼后用
                          byte[] byts = new byte[Request.InputStream.Length];
                       Request.InputStream.Read(byts,
          0,byts.Length);
                          
          然后用Response.OutputStream.write()返回信息
                  3、A(a.jsp)接收B服務(wù)器的反饋信息(和1的代碼同在a.jsp中,并且就接著1代碼的后面)
                         if(conn.getResponseCode()==200){
                             String line=null;
                             String body="";
                             is = conn.getInputStream();
                             BufferedReader br = new BufferedReader(new InputStreamReader(is));
                             while ((line = br.readLine()) != null) {
                                  body += line;
                             }
                             conn.disconnect();
                        }
                  其中訪問(wèn)一個(gè)頁(yè)面主要用到了HttpURLConnection這個(gè)類(lèi),當(dāng)然還有其它幾種方式可以使用,具體請(qǐng)參見(jiàn)我的文章http://www.aygfsteel.com/vickzhu/archive/2008/11/12/240013.html
          posted @ 2009-01-04 14:57 筱 筱 閱讀(1055) | 評(píng)論 (1)編輯 收藏

          錯(cuò)誤代碼:
          org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
          錯(cuò)誤原因:
          OpenSessionInViewFilter在getSession的時(shí)候,會(huì)把獲取回來(lái)的session的flush mode 設(shè)為FlushMode.NEVER。然后把該sessionFactory綁定到TransactionSynchronizationManager,使request的整個(gè)過(guò)程都使用同一個(gè)session,在請(qǐng)求過(guò)后再解除該sessionFactory的綁定,最后closeSessionIfNecessary根據(jù)該session是否已和transaction綁定來(lái)決定是否關(guān)閉session。在這個(gè)過(guò)程中,若HibernateTemplate 發(fā)現(xiàn)自當(dāng)前session有不是readOnly的transaction,就會(huì)獲取到FlushMode.AUTO Session,使方法擁有寫(xiě)權(quán)限。
          也即是,如果有不是readOnly的transaction就可以由Flush.NEVER轉(zhuǎn)為Flush.AUTO,擁有insert,update,delete操作權(quán)限,如果沒(méi)有transaction,并且沒(méi)有另外人為地設(shè)flush model的話,則doFilter的整個(gè)過(guò)程都是Flush.NEVER。所以受transaction保護(hù)的方法有寫(xiě)權(quán)限,沒(méi)受保護(hù)的則沒(méi)有。
          參考文章:
          http://calvin.blog.javascud.org/post/46.htm
          解決辦法:
          采用spring的事務(wù)聲明,使方法受transaction控制
          <bean id="baseTransaction"
          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
          abstract="true">
          <property name="transactionManager" ref="transactionManager"/>
          <property name="proxyTargetClass" value="true"/>
          <property name="transactionAttributes">
          <props>
          <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
          <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
          <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
          <prop key="save*">PROPAGATION_REQUIRED</prop>
          <prop key="add*">PROPAGATION_REQUIRED</prop>
          <prop key="update*">PROPAGATION_REQUIRED</prop>
          <prop key="remove*">PROPAGATION_REQUIRED</prop>
          </props>
          </property>
          </bean>
              <bean id="userService" parent="baseTransaction">
          <property name="target">
          <bean class="com.phopesoft.security.service.impl.UserServiceImpl"/>
          </property>
          </bean>

          posted @ 2008-12-11 11:20 筱 筱 閱讀(455) | 評(píng)論 (0)編輯 收藏

          暫時(shí)發(fā)現(xiàn)了兩種靜態(tài)頁(yè)包含靜態(tài)頁(yè)的方法
          1、<object style="border:0px" type="text/x-scriptlet" data="test.html" width=100% height=1000></object>
          2、<iframe src="" frameborder="0"></iframe>
          第一種可以解決大部分問(wèn)題,不過(guò)第二種如果你的a頁(yè)面包含b頁(yè)面,b頁(yè)面中的鏈接都是在b頁(yè)面本頁(yè)打開(kāi)的話,b鏈接的頁(yè)面就不會(huì)在a主窗體顯示
          posted @ 2008-11-26 09:49 筱 筱 閱讀(335) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共9頁(yè): 上一頁(yè) 1 2 3 4 5 6 7 8 9 下一頁(yè) 
          主站蜘蛛池模板: 开原市| 扎赉特旗| 东阳市| 郓城县| 柳江县| 太保市| 杂多县| 安化县| 康乐县| 杭锦旗| 大姚县| 肃南| 和顺县| 永川市| 西青区| 六安市| 潼南县| 册亨县| 万山特区| 罗城| 靖州| 嵩明县| 昂仁县| 儋州市| 武汉市| 云霄县| 永城市| 固阳县| 大埔区| 西充县| 监利县| 迁安市| 洞口县| 河间市| 井研县| 阿瓦提县| 武宣县| 柯坪县| 张家口市| 阳江市| 大厂|