Tomcat连接池方法

时间:2011-10-12 10:46:01

标签: java jdbc connection-pooling

我正在开发一个J2EE应用程序,它将接收来自移动应用程序的请求,并执行一些数据库操作以向用户显示数据。

所以数据库连接池对我来说非常重要。我在我的J2EE应用程序的 META-INF 文件夹中声明了context.xml。它看起来如下

<Context debug="0"
    reloadable="true" crossContext="false" privileged="true" cookies="true" >

     <Resource name="jdbc/servicedb" 
               auth="Container"
               type="javax.sql.DataSource" 
               driverClassName="oracle.jdbc.OracleDriver"
               username="XXXXXX"
               password="XXXXXX"
               url="jdbc:oracle:thin:@XXXXXXXXXXX:XXXX:XXXXXXX"
               initialSize="10"
               maxActive="100"
               maxIdle="50"
               minIdle="10"
               suspectTimeout="60"
               timeBetweenEvictionRunsMillis="30000"
               minEvictableIdleTimeMillis="60000"/>
</Context>

这是我的连接类中返回连接的方法

public static Connection getConnection()
    {
        Connection dbConnection = null;

        //loading from the dao.properties file
        DAOProperties properties = new DAOProperties("com.jndi");
        String url = properties.getProperty(PROPERTY_URL, true);
        String driverClassName = properties.getProperty(PROPERTY_DRIVER, false);
        String password = properties.getProperty(PROPERTY_PASSWORD, false);
        String username = properties.getProperty(PROPERTY_USERNAME, password != null);

     // If driver is specified, then load it to let it register itself with DriverManager.
        if(driverClassName !=null){
            try
            {
                Class.forName(driverClassName);
                dbConnection = DriverManager.getConnection(url, username, password);

            }catch(ClassNotFoundException e){
                // Could not find the database driver
                e.printStackTrace();
                System.out.println("database driver error");
            }catch(Exception e){
                e.printStackTrace();
            }
        }
     // Else assume URL as DataSource URL and lookup it in the JNDI.
        else{
            Context initContext;
            DataSource ds;
            try {
                initContext = new InitialContext();
                Context envContext  = (Context)initContext.lookup(JNDI_ROOT);
                if(envContext!=null){
                    ds = (DataSource)envContext.lookup(url);
                    if(ds!=null){
                        try {
                            dbConnection = ds.getConnection();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }
                }
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }
        return dbConnection;
    }

DAOProperties是一个用于加载Properties文件的包装类。我从here

获取它

我正在关闭这样的连接

public static void close(Connection connection) {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                System.err.println("Closing Connection failed: " + e.getMessage());
                e.printStackTrace();
            }
        }
    }

最后我使用连接来填充像这样的列表

public loadlist(){
        Connection dbConnection = null;
        try{
            dbConnection = Connection.getConnection();
        if(dbConnection !=null){

            System.out.println("Connected to database");
            LOGGER.debug("Successfully connected to database");
        else{
                System.out.println("No Connection Exists");
                LOGGER.debug("unable to connect to database");
        }
        }catch (SQLException e) {
            // Could not connect to the database
            e.printStackTrace();
            System.out.println("database connection failed");
            LOGGER.debug("database connection failed due to SQLException");
        }finally{
            Connection.close(dbConnection);
            LOGGER.debug("connection closed");
        }
        return result;
    }

刚才我在连接池上经历了this

我怀疑我是否可以关闭连接或将其返回池中?

我还想知道如何返回到池的连接?

请帮忙。

2 个答案:

答案 0 :(得分:2)

假设您的代码采用getConnection()方法中的 else 路径(即它执行JNDI查找而不是使用 DriverManager ),您使用连接池是正确的。

您无法在关闭连接并将其返回池中进行选择。如果从池中获得连接,close()将把它返回池中(而不是关闭它)。别无选择。您只能关闭自己创建的连接。

答案 1 :(得分:0)

我不明白为什么你要编写自己的连接池。

我建议废弃这种方法并使用由Tomcat管理的JNDI数据源和其他人编写的池。 Apache有一个很好的DBCP - 为什么要写自己的?