JDBC開發

 

1、  使用數據庫連接池優化程序性能

a)         應用程序直接獲取連接的缺點: 用戶每次請求都需要向數據庫獲得鏈接,而數據庫創建連接通常需要消耗相對較大的資源,創建時間也較長

b)        使用連接池中獲取的倆節數據庫通訊

2、  編寫數據庫連接池;

a)         編寫連接池需實現javax.sql.DataSource接口。DataSource接口中定義了兩個重載的getConnection方法:Connection getConnection()、Connection getConnection(String username,String password)

b)        實現DateSource接口,並把創建的連接池加入Linkedlist對象中。

                        i.              在DateSource構造函數中批量創建與數據庫的連接,並把創建的連接加入LinkedList對象中

                      ii.              實現getConnection方法,讓get讓getConnection方法每次調用時,從LinkedList中取一個Connection返回給用戶。

                    iii.              當用戶使用完Connection,調用Connection.close()方法時,Collection對象應保證將自己返回到LinkedList中,而不要把conn還給數據庫。

3、  數據庫連接池核心代碼

a)         proxyConn = (Connection) Proxy.newProxyInstance(this.getClass()

                     .getClassLoader(), conn.getClass().getInterfaces(),

                     new InvocationHandler() {

              //此處爲內部類,當close方法被調用時將conn還回池中,其它方法直接執行

                     public Object invoke(Object proxy, Method method,

                                  Object[] args) throws Throwable {

                            if (method.getName().equals("close")) {

                                   pool.addLast(conn);

                                   return null;

                     }

                     return method.invoke(conn, args);

              }

       });

 

4、  開源數據庫連接池

a)         DBCP 數據庫連接池

                        i.              使用DBCP數據源,應用程序應在系統中增加如下兩個 jar 文件:

1.         Commons-dbcp.jar:連接池的實現

2.         Commons-pool.jar:連接池實現的依賴庫

                      ii.              DBCP連接池核心代碼

1.         static{

a)         InputStream in=JdbcUtil.class.getClassLoader();

getResourceAsStream(“dbcpconfig.properties”);

Properties prop=new Properties();

Prop.load(in);

BasicDataSourceFactory factory=new BasicDataSourceFactory();

dataSource=factory.createDateSource(prop);

}

b)        C3P0 數據庫連接池

                        i.              代碼:

1.         CombopooleDateSource ds=new CombopooleDateSource();

ds.setDriverClass(“com.mysql.jdbc.Driver”);

ds.setJdbcUrl(“jdbc:mysql://localhost:3306/jdbc1”);

ds.setUser(“root”);

ds.setPassword(“password”);

ds.setMaxPoolSize(40);

ds.setMinPoolSize(10);

ds.setInitialPoolSize(30);

Connection conn=ds.getConnection();

5、  配合Tomcat數據

a)         查看Tomcat文檔;

<Context>

  <Resource name="jdbc/datasource" auth="Container"

            type="javax.sql.DataSource" username="root" password="root"

            driverClassName="com.mysql.jdbc.Driver"

                    url="jdbc:mysql://localhost:3306/jdbc"

            maxActive="8" maxIdle="4"/>

</Context>

 

 

 

Context initCtx = new InitialContext();

Context envCtx = (Context) initCtx.lookup("java:comp/env");

dataSource = (DataSource)envCtx.lookup("jdbc/datasource");

 

b)            注:此配置下,驅動jar文件要放在tomcat的lib下

6、  JNDI技術簡介

       a)    JNDI(Java Naming and Directory Interface),Java命名和目錄接口,它對應於J2SE中的javax.naming包,

b)      這套API的主要作用在於:它可以把Java對象放在一個容器中(JNDI容器),併爲容器中的java對象取一個名稱,以後程序想獲得Java對象,只需通過名稱檢索即可。

c)       其核心API爲Context,它代表JNDI容器,其lookup方法爲檢索容器中對應名稱的對象。

d)      代碼:

           //初始化jndi容器

           Context initCtx=new InitialContext();

           //檢索web服務器中的jndi容器

           Context envCtx=(Context) initCtx.lookup("java:comp/env");

           //從JNDI容器找數據庫連接池

DataSource ds=(DataSource) envCtx.lookup("jdbc/TestDB");

 

 

 

      

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章