c3p0 ConnectionPools設置與使用

c3p0是一個基於JNDI-bindable DataSources(使用DriverManager-based)的很容易使用的JDBC驅動函數庫。

所以在使用c3p0時,還需要一個JDBC的Driver,才能使用,而c3p0的作用只是控制Database的Connection使用,舉個簡單的例子,當Connection被DataBase Server timeout斷線後,c3p0會自動多次去重新連線,避免程式就直接丟出SQLException。

這次剛好遇到Microsoft SQL Server 2005不知為何一直丟出以下訊息,才去找到c3p0來使用的,發生的原因似乎是SQL Server本身對JDBC的Connection TimeOut斷線、或是Connection數不夠。

I/O Error: Connection reset
I/O Error: Software caused connection abort: recv failed

下面是一個範例,結果如下圖:

c3p0.png

原始碼下載

package com.yslifes;

import java.beans.PropertyVetoException;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DB {
    private static ComboPooledDataSource  ds = null;
    public static DataSource getPool() throws java.sql.SQLException
    {
      //com.mysql.jdbc.jdbc2.optional. ds = null;
      if(ds==null)
      {
          
        ds = new ComboPooledDataSource();
        

        try {
            ds.setDriverClass( "net.sourceforge.jtds.jdbc.Driver" );
        } catch (PropertyVetoException e) {
            
            e.printStackTrace();
            throw new java.sql.SQLException(e.getMessage());
        } //loads the jdbc driver            
        ds.setJdbcUrl( "jdbc:jtds:sqlserver://localhost:1433/master" );
        ds.setUser("sa");                                  
        ds.setPassword("admin123");
        /*ds.setIdleConnectionTestPeriod(30);
        ds.setNumHelperThreads(10);
        ds.setUnreturnedConnectionTimeout(600);
        ds.setMaxIdleTime(30);
        */
      }

      
      return ds;
    }
    public static java.sql.Connection getConnection() throws java.sql.SQLException
    {
        
        return getPool().getConnection();
    }
    public static void main(String args[]) throws SQLException
    {
        java.sql.Connection con = DB.getConnection();
        con.close();
    }
}

 

發表迴響