C3P0开源数据库连接池的编写源码

来源:互联网 发布:网络的缺点有哪些 编辑:程序博客网 时间:2024/05/22 05:11
 

C3P0开源数据库连接池的编写源码

C3P0代码分析

public class DBManager_c3p0 {

    // 第一步:静态初始化快,加载配置文件

    private static ComboPooledDataSource ds =null;

    static {

       利用xml中的文件

       ds = new ComboPooledDataSource();

        ds.setDriverClass("com.mysql.jdbc.Driver");

       ds.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc");

       ds.setUser("root");

       ds.setPassword("qiao");

       ds.setInitialPoolSize(10);

       ds.setMaxPoolSize(50);

       ds.setMinPoolSize(10);

    }

 

    public static Connection getConnection() throws SQLException{

       return ds.getConnection();

    }

    // 是把资源归还到连接池中

    public static void release(Connection con, PreparedStatement st,

           ResultSet rs) {

       if (rs != null) {

           try {

              rs.close();

           } catch (Exception e) {

              e.printStackTrace();

           }

           rs = null;

       }

       if (con != null) {

           try {

              con.close();

           } catch (Exception e) {

              e.printStackTrace();

           }

           con = null;

       }

       if (st != null) {

           try {

              st.close();

           } catch (SQLException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

       }

 

    }

注:最核心的地方就是静态初始化(static)里的东西,也就相当于是配置文件中的数值设置,即是数据库的连接,我们完全可以把这么数据写成一个xml文档,用来存储这些数据,xml文档为c3p0-config.xml

    <c3p0-config>

    <default-config>

       <property name="driverClass">com.mysql.jdbc.Driver</property>

       <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property>

       <property name="user">root</property>

       <property name="password">qiao</property>

   

       <property name="automaticTestTable">con_test</property>

       <property name="checkoutTimeout">30000</property>

       <property name="idleConnectionTestPeriod">30</property>

       <property name="initialPoolSize">10</property>

       <property name="maxIdleTime">30</property>

       <property name="maxPoolSize">100</property>

       <property name="minPoolSize">10</property>

       <property name="maxStatements">200</property>   

    </default-config>

   

    <!-- This app is massive! -->

    <named-config name="mysql">

       <property name="driverClass">com.mysql.jdbc.Driver</property>

       <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property>

       <property name="user">root</property>

       <property name="password">qiao</property>

       <property name="acquireIncrement">50</property>

       <property name="initialPoolSize">100</property>

       <property name="minPoolSize">50</property>

       <property name="maxPoolSize">1000</property>

    </named-config>

   

</c3p0-config>

所有上面的代码可以写为:

    public class DBManager_c3p0 {

    // 第一步:静态初始化块,加载配置文件

    private static ComboPooledDataSource ds =null;

    static {

       //利用xml中的文件

       ds = new ComboPooledDataSource("mysql");

    }

 

    public static Connection getConnection() throws SQLException{

       return ds.getConnection();

    }

    // 是把资源归还到连接池中

    public static void release(Connection con, PreparedStatement st,

           ResultSet rs) {

       if (rs != null) {

           try {

              rs.close();

           } catch (Exception e) {

              e.printStackTrace();

           }

           rs = null;

        }

       if (con != null) {

           try {

              con.close();

           } catch (Exception e) {

              e.printStackTrace();

           }

           con = null;

       }

       if (st != null) {

           try {

              st.close();

           } catch (SQLException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

       }

    }

注:ds = new ComboPooledDataSource("mysql");中的参数是xml文档中的命名的name,也可以用默认的,如果没有指定则为默认的。

 

原创粉丝点击