所有的連接方式?
????首先選擇合適自己數(shù)據(jù)庫的驅(qū)動程序,這里提到的都是常用驅(qū)動。
連接Oracle數(shù)據(jù)庫
??獲得Oracle的驅(qū)動程序包classes12.jar
??把Oracle的驅(qū)動程序到\WEB-INF\lib下
??Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
??Connection?conn=?DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:數(shù)據(jù)庫","用戶名","密碼");
?
連接MYSQL數(shù)據(jù)庫
??獲得MySQL的驅(qū)動程序包mysql-connector-java-3.0.15-ga-bin(mysqldriver.jar)
??拷貝到\WEB-INF\lib下
??Class.forName("org.gjt.mm.mysql.Driver").newInstance();
??Connection?conn=?DriverManager.getConnection("jdbc:mysql://localhost/testDB","用戶名","密碼"??);
?
連接Sql?2000數(shù)據(jù)庫
??獲得SQL直接的驅(qū)動程序包msbase.jar和mssqlserver.jar和msutil.jar
??把直?驅(qū)動程序包放到\WEB-INF\lib下
??Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
??Connection?conn=?DriverManager.getConnection(????"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=數(shù)據(jù)庫"","用戶名","密碼");
?
橋連
??Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();;
Connection?con=DriverManager.getConnection("jdbc:odbc:odbc名","用戶名","密碼");
?
JTDS??
net.sourceforge.jtds.jdbc.Driver
jdbc:jtds:sqlserver://172.16.3.60:1433/test
?
HIBERNATE
它的配置連接方式通常有2中,1、hibernate.cfg.xml?靈活性高
2、hibernate.properties?
建議使用1配置,這里不在對2進行多的闡述。
當程序啟動時,首先加載的是hibernate.properties?
,如果系統(tǒng)找不到此文件,會根據(jù)你程序的配置而執(zhí)行。
這里講下常用配置
Session?session=new?Configuration().configure().buildSessionFactory().openSession();
如果按上述配置,則程序啟動時候仍然首先找hibernate.properties?,找不到時候就會加載hibernate.cfg.xml
(權(quán)限hibernate.properties>hibernate.cfg.xml)兩個文件都存在時候以hibernate.properties為主。
?
?
?
?
記錄集(不建議使用記錄集操作記錄,涉及到什么時候關(guān)閉連接的頭疼問題,常用的如LIST等對象)
??1、Statement?stat=con.prepareStatement("select?*?from?Login?where?id=?");
???stat.setString(1,textPinNo.getText());
??ResultSet?result=stat.executeQuery();
??注:("select?*?from?Login?where(?,?,?,?,?)")應(yīng)該與數(shù)據(jù)庫對應(yīng)
??2、Statement?stat=con.prepareStatement("select?*?from?Login?where?id="+變量);
??ResultSet?result=stat.executeQuery();
??如果是非查詢語句,則int?i=stat.executeUpdate();
(注:驅(qū)動后的“.newInstance()”可以不加。聲明、記錄集最基本的是statement、ResultSet還有其他更高級的)
?
?
?
JDBC學(xué)習(xí)筆記-----jdbc性能優(yōu)化(轉(zhuǎn))
jdbc程序的性能主要由兩個因素決定,一是數(shù)據(jù)庫本身的性質(zhì),另一個是與數(shù)據(jù)庫相對獨立的jdbc應(yīng)用程序接口(api)的使用.
這里說的是如何正確使用jdbc編程接口,以獲得更好的性能.
??jdbc主要優(yōu)化有:
?????1.選擇正確的jdbc驅(qū)動程序
?????2.Connention的優(yōu)化??使用連接池來管理Connection對象
?????3.Statement的優(yōu)化???使用批量更新等
?????4.Result的優(yōu)化??正確的從數(shù)據(jù)庫中g(shù)et數(shù)據(jù)等
?????
?????(1)選擇正確的jdbc驅(qū)動程序:
??1?jdbc-odbc?橋
????????????2?本地api-部分?java驅(qū)動
????????????????3?jdbc網(wǎng)路協(xié)議-純java驅(qū)動
????????????????4?jdbc本地協(xié)議
????????????????最好選擇?jdbc網(wǎng)路協(xié)議-純java驅(qū)動??效率比較高??但需要第三方軟件的支持?比如corba??weblogic屬于這種類型
????
?????(2)優(yōu)化Connection對象:
?????????1.設(shè)置適當?shù)膮?shù)??DriverManager.getConnection(String?url,Properties?props);
?????????????????例如:?????Properties?props=new?Properties();
??????props.put("user","wuwei");
??????props.put("password","wuwei");
????????????props.put("defaultRowPrefectch","30");
???????????????????????????props.put("dufaultBatchValue","5");
???????????????????????????Connection?con=DriverManager.getConnection("jdbc:oracle:thin:@hostsString",props);
?????????????對象可以通過設(shè)置setDefaultRowPrefetch(int)?和?setDefaultBatchValue(int)?兩個參數(shù)類優(yōu)化連接
?
?2.使用連接池??可以自己寫一個連接池?這樣程序的靈活性強,便于移植.
??????apache項目開發(fā)了一套非常通用而表現(xiàn)非常穩(wěn)定的對象池? http://jakarta.apache.org/commons/pool.htm
??????設(shè)計了自己的連接池后?在客戶端調(diào)用建立對象
???????????????????????????public?Object?makeObject()?throws?Exception{
????Class.forName("oracle.jdbc.driver.OracalDriver");
????return?DriverManager.getConnection("url","username","password");
??????}
??????????????????銷毀對象時用
??????public?void?destroyObject(Object?obj)?throws?Exception{
?????????((Connection)obj.close());
??????}
????????注意幾點?對象池里有沒有回收機制,對象池里有機有容量限制,對象池里有多少個閑置對象(可以釋放)????????
??
????????3.控制事務(wù)的提交??最好手動提交事務(wù),不但可以可以保證數(shù)據(jù)原子性,而且對新能提高留下余地.
???????????????????try{
???connection.setAutoCommint(false);
????????????????????????//?代碼?用PreparedStatement??性能比Statementh好.
?
????????????????????????connection.commit();
????????????????????????connection.setAutoCommit(true);
?????}
????????????catch(SQLException?e){
???????????????????}
???????????????????finally{
???//代碼
???if(connection!=null){
??????connection.close();??
???}
???????}
?
?4.適當?shù)倪x擇事務(wù)的隔離級別???TRANSACTION_READ_UNCOMMITED??性能最高
?????????????????????????????????????TRANSACTION_READ_COMMITED????快
?????????????????????????????????????TRANSACTION_REFEATABLE_READ??中等
????????????RANSACTION_SERIALIZABLE??????慢
?
???(3)Statement?優(yōu)化
??????jdbc3個接口用來處理sql的執(zhí)行,是Statement?PreparedStatement?CallableStatement
??????????提供適當?shù)腟tatement接口?
??????????批量執(zhí)行sql
??????????從數(shù)據(jù)庫批量獲取數(shù)據(jù)
??????PreparedStatement?比Statement性能要好?主要體現(xiàn)在一個sql語句多次重復(fù)執(zhí)行的情況
??????PreparedStatemnt只編譯解析一次而Statement每次編譯一次.
??????
??????批量修改數(shù)據(jù)庫???
?Statement?提供了方法addBatch(String)和executeBatch()
????????調(diào)用方法為stmt.addBatch("isnert.....");?stmt.addBatch("update.....")
??????????????????stmt.executeBatch();
????????也可以用PreparedStatement從而更好的提高性能.
????????????????pstmt=conn.preparedStatement("insert?into?test_table(......)?values(....?)");
????????????????pstmt.setString(1,"aaa");
????????????????pstmt.addBatch();
????????????????pstmt.setString(1,"bbb");
????????????????pstmt.addBatch();
????????????????.....
????????????????pstmt.executeBatch();
?
??????批量地從數(shù)據(jù)庫中取數(shù)據(jù).
??????????通過setFetchSize()和getFectchSize()方法來設(shè)定和查看這個參數(shù).這個參數(shù)對體統(tǒng)的性能影響比較大.
??????????這個參數(shù)太小會嚴重地降低程序地性能.
???Connection?Statement?ResultSet都有這個參數(shù),他們對性能地影響順序是:
?????????????ResultSet---------Statement---------Connection
??(4)優(yōu)化ResultSet.
?????體現(xiàn)在以下幾個方面
????????批量讀取數(shù)據(jù).合理設(shè)置ResultSet的getFetchSize()和setFetchSize()方法中的參數(shù)
????????使用正確的get和set方法
?????????????使用整數(shù)而不是字段名作為參數(shù)性能比較高,
?????????????例如?setInt(1,100);
??????????????????setString(2,"aaaa");
???????????????比?setInt("id","100");
??????????????????setString("name","aaaa");
???????????????性能好
????????設(shè)置適當?shù)臐L動方向.有3個方向FETCH_FORWORD,FETCH_REVERSE?FETCH_UNKNOWN
?????????????單向滾動性能比較高.
??其他方面的性能優(yōu)化
??????及時顯示的關(guān)閉Connection?Statement?ResultSet
??????????其中Connection可以用Connetion?Pool處理.
??????使用數(shù)據(jù)庫系統(tǒng)的強大查詢功能去組織數(shù)據(jù).這樣程序運行是和數(shù)據(jù)庫服務(wù)的交互次數(shù)少,數(shù)據(jù)庫返回給
??????程序的記錄條數(shù)少的多,所以性能有很大的提高.
????首先選擇合適自己數(shù)據(jù)庫的驅(qū)動程序,這里提到的都是常用驅(qū)動。
連接Oracle數(shù)據(jù)庫
??獲得Oracle的驅(qū)動程序包classes12.jar
??把Oracle的驅(qū)動程序到\WEB-INF\lib下
??Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
??Connection?conn=?DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:數(shù)據(jù)庫","用戶名","密碼");
?
連接MYSQL數(shù)據(jù)庫
??獲得MySQL的驅(qū)動程序包mysql-connector-java-3.0.15-ga-bin(mysqldriver.jar)
??拷貝到\WEB-INF\lib下
??Class.forName("org.gjt.mm.mysql.Driver").newInstance();
??Connection?conn=?DriverManager.getConnection("jdbc:mysql://localhost/testDB","用戶名","密碼"??);
?
連接Sql?2000數(shù)據(jù)庫
??獲得SQL直接的驅(qū)動程序包msbase.jar和mssqlserver.jar和msutil.jar
??把直?驅(qū)動程序包放到\WEB-INF\lib下
??Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
??Connection?conn=?DriverManager.getConnection(????"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=數(shù)據(jù)庫"","用戶名","密碼");
?
橋連
??Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();;
Connection?con=DriverManager.getConnection("jdbc:odbc:odbc名","用戶名","密碼");
?
JTDS??
net.sourceforge.jtds.jdbc.Driver
jdbc:jtds:sqlserver://172.16.3.60:1433/test
?
HIBERNATE
它的配置連接方式通常有2中,1、hibernate.cfg.xml?靈活性高
2、hibernate.properties?
建議使用1配置,這里不在對2進行多的闡述。
當程序啟動時,首先加載的是hibernate.properties?
,如果系統(tǒng)找不到此文件,會根據(jù)你程序的配置而執(zhí)行。
這里講下常用配置
Session?session=new?Configuration().configure().buildSessionFactory().openSession();
如果按上述配置,則程序啟動時候仍然首先找hibernate.properties?,找不到時候就會加載hibernate.cfg.xml
(權(quán)限hibernate.properties>hibernate.cfg.xml)兩個文件都存在時候以hibernate.properties為主。
?
?
?
?
記錄集(不建議使用記錄集操作記錄,涉及到什么時候關(guān)閉連接的頭疼問題,常用的如LIST等對象)
??1、Statement?stat=con.prepareStatement("select?*?from?Login?where?id=?");
???stat.setString(1,textPinNo.getText());
??ResultSet?result=stat.executeQuery();
??注:("select?*?from?Login?where(?,?,?,?,?)")應(yīng)該與數(shù)據(jù)庫對應(yīng)
??2、Statement?stat=con.prepareStatement("select?*?from?Login?where?id="+變量);
??ResultSet?result=stat.executeQuery();
??如果是非查詢語句,則int?i=stat.executeUpdate();
(注:驅(qū)動后的“.newInstance()”可以不加。聲明、記錄集最基本的是statement、ResultSet還有其他更高級的)
?
?
?
JDBC學(xué)習(xí)筆記-----jdbc性能優(yōu)化(轉(zhuǎn))
jdbc程序的性能主要由兩個因素決定,一是數(shù)據(jù)庫本身的性質(zhì),另一個是與數(shù)據(jù)庫相對獨立的jdbc應(yīng)用程序接口(api)的使用.
這里說的是如何正確使用jdbc編程接口,以獲得更好的性能.
??jdbc主要優(yōu)化有:
?????1.選擇正確的jdbc驅(qū)動程序
?????2.Connention的優(yōu)化??使用連接池來管理Connection對象
?????3.Statement的優(yōu)化???使用批量更新等
?????4.Result的優(yōu)化??正確的從數(shù)據(jù)庫中g(shù)et數(shù)據(jù)等
?????
?????(1)選擇正確的jdbc驅(qū)動程序:
??1?jdbc-odbc?橋
????????????2?本地api-部分?java驅(qū)動
????????????????3?jdbc網(wǎng)路協(xié)議-純java驅(qū)動
????????????????4?jdbc本地協(xié)議
????????????????最好選擇?jdbc網(wǎng)路協(xié)議-純java驅(qū)動??效率比較高??但需要第三方軟件的支持?比如corba??weblogic屬于這種類型
????
?????(2)優(yōu)化Connection對象:
?????????1.設(shè)置適當?shù)膮?shù)??DriverManager.getConnection(String?url,Properties?props);
?????????????????例如:?????Properties?props=new?Properties();
??????props.put("user","wuwei");
??????props.put("password","wuwei");
????????????props.put("defaultRowPrefectch","30");
???????????????????????????props.put("dufaultBatchValue","5");
???????????????????????????Connection?con=DriverManager.getConnection("jdbc:oracle:thin:@hostsString",props);
?????????????對象可以通過設(shè)置setDefaultRowPrefetch(int)?和?setDefaultBatchValue(int)?兩個參數(shù)類優(yōu)化連接
?
?2.使用連接池??可以自己寫一個連接池?這樣程序的靈活性強,便于移植.
??????apache項目開發(fā)了一套非常通用而表現(xiàn)非常穩(wěn)定的對象池? http://jakarta.apache.org/commons/pool.htm
??????設(shè)計了自己的連接池后?在客戶端調(diào)用建立對象
???????????????????????????public?Object?makeObject()?throws?Exception{
????Class.forName("oracle.jdbc.driver.OracalDriver");
????return?DriverManager.getConnection("url","username","password");
??????}
??????????????????銷毀對象時用
??????public?void?destroyObject(Object?obj)?throws?Exception{
?????????((Connection)obj.close());
??????}
????????注意幾點?對象池里有沒有回收機制,對象池里有機有容量限制,對象池里有多少個閑置對象(可以釋放)????????
??
????????3.控制事務(wù)的提交??最好手動提交事務(wù),不但可以可以保證數(shù)據(jù)原子性,而且對新能提高留下余地.
???????????????????try{
???connection.setAutoCommint(false);
????????????????????????//?代碼?用PreparedStatement??性能比Statementh好.
?
????????????????????????connection.commit();
????????????????????????connection.setAutoCommit(true);
?????}
????????????catch(SQLException?e){
???????????????????}
???????????????????finally{
???//代碼
???if(connection!=null){
??????connection.close();??
???}
???????}
?
?4.適當?shù)倪x擇事務(wù)的隔離級別???TRANSACTION_READ_UNCOMMITED??性能最高
?????????????????????????????????????TRANSACTION_READ_COMMITED????快
?????????????????????????????????????TRANSACTION_REFEATABLE_READ??中等
????????????RANSACTION_SERIALIZABLE??????慢
?
???(3)Statement?優(yōu)化
??????jdbc3個接口用來處理sql的執(zhí)行,是Statement?PreparedStatement?CallableStatement
??????????提供適當?shù)腟tatement接口?
??????????批量執(zhí)行sql
??????????從數(shù)據(jù)庫批量獲取數(shù)據(jù)
??????PreparedStatement?比Statement性能要好?主要體現(xiàn)在一個sql語句多次重復(fù)執(zhí)行的情況
??????PreparedStatemnt只編譯解析一次而Statement每次編譯一次.
??????
??????批量修改數(shù)據(jù)庫???
?Statement?提供了方法addBatch(String)和executeBatch()
????????調(diào)用方法為stmt.addBatch("isnert.....");?stmt.addBatch("update.....")
??????????????????stmt.executeBatch();
????????也可以用PreparedStatement從而更好的提高性能.
????????????????pstmt=conn.preparedStatement("insert?into?test_table(......)?values(....?)");
????????????????pstmt.setString(1,"aaa");
????????????????pstmt.addBatch();
????????????????pstmt.setString(1,"bbb");
????????????????pstmt.addBatch();
????????????????.....
????????????????pstmt.executeBatch();
?
??????批量地從數(shù)據(jù)庫中取數(shù)據(jù).
??????????通過setFetchSize()和getFectchSize()方法來設(shè)定和查看這個參數(shù).這個參數(shù)對體統(tǒng)的性能影響比較大.
??????????這個參數(shù)太小會嚴重地降低程序地性能.
???Connection?Statement?ResultSet都有這個參數(shù),他們對性能地影響順序是:
?????????????ResultSet---------Statement---------Connection
??(4)優(yōu)化ResultSet.
?????體現(xiàn)在以下幾個方面
????????批量讀取數(shù)據(jù).合理設(shè)置ResultSet的getFetchSize()和setFetchSize()方法中的參數(shù)
????????使用正確的get和set方法
?????????????使用整數(shù)而不是字段名作為參數(shù)性能比較高,
?????????????例如?setInt(1,100);
??????????????????setString(2,"aaaa");
???????????????比?setInt("id","100");
??????????????????setString("name","aaaa");
???????????????性能好
????????設(shè)置適當?shù)臐L動方向.有3個方向FETCH_FORWORD,FETCH_REVERSE?FETCH_UNKNOWN
?????????????單向滾動性能比較高.
??其他方面的性能優(yōu)化
??????及時顯示的關(guān)閉Connection?Statement?ResultSet
??????????其中Connection可以用Connetion?Pool處理.
??????使用數(shù)據(jù)庫系統(tǒng)的強大查詢功能去組織數(shù)據(jù).這樣程序運行是和數(shù)據(jù)庫服務(wù)的交互次數(shù)少,數(shù)據(jù)庫返回給
??????程序的記錄條數(shù)少的多,所以性能有很大的提高.