缓存JDBC连接

时间:2016-09-17 18:11:26

标签: java mysql tomcat servlets jdbc

我有一个小型的电子商务应用程序,它依赖于数据库。我已经看到了它的一些性能问题,主要是建立与数据库的连接。我不是DBA,也不是任何其他深层数据库知识 - 但我知道缓存连接而不是一直建立新连接是有意义的。

以下是获取连接的方法:

public Connection getConnection() throws SQLException, ClassNotFoundException  {
    Class.forName("com.mysql.jdbc.Driver"); 
    con=DriverManager.getConnection("jdbc:mysql://182.31.456.32:3306/"+database+"",""+username+"",""+password+""); 
   // stm=con.createStatement(); 
    return con;
}

我的问题是 - 如何轻松缓存当前连接并重用它而不是使用JDBC / Java创建新连接?

感谢。

3 个答案:

答案 0 :(得分:6)

在您拥有相当大的电子商务应用的情况下,您通常不会按照您在代码中显示的方式编写数据库连接。

我们使用连接池。

我想,您的电子商务应用程序将部署在某个应用程序服务器中,使用该服务器的连接池工具来管理您的数据库连接。

如果没有服务器的应用程序,您可以使用其中一个连接池API(如C3P0等)显式编码池功能。

我猜你所谓的连接缓存主要是要求实现 Singleton 。互联网上会有很多关于如何实现单例的例子,但你不应该在代码中关闭连接。

有一种称为 connection-timeout 的时间,如果使用单连接缓存解决方案,则需要正确设置。

希望它有所帮助!!

答案 1 :(得分:3)

您需要的是连接池,您可以在Tomcat中轻松配置开箱即用,这样连接池将由Tomcat直接管理,从而避免许多集成问题,保证完全兼容并避免添加新的依赖项。

以下是要遵循的步骤:

1。全局定义连接池

conf/contex.xml中,您需要将连接池定义为Resource,例如在您的情况下,它可能是这样的:

<Context>

    ...
    <Resource name="jdbc/myPool" auth="Container" type="javax.sql.DataSource"
                initialSize="5" maxActive="20" minIdle="5" maxIdle="15" maxWait="10000"
                validationQuery="SELECT 1" validationQueryTimeout="5"
                testWhileIdle="true" testOnBorrow="true" testOnReturn="false"
                timeBetweenEvictionRunsMillis="30000" minEvictableIdleTimeMillis="60000"
                removeAbandoned="true" removeAbandonedTimeout="300" logAbandoned="false"
                poolPreparedStatements="true"
                username="myUsername" password="myPassword"
                driverClassName="com.mysql.jdbc.Driver" 
                url="jdbc:mysql://182.31.456.32:3306/mydb?autoReconnect=true" />
</Context>

2。为您的webapp声明您的连接池

在您的网络应用的web.xml中,您需要使用resource-ref进行本地定义:

<web-app>
    ...
    <resource-ref>
        <res-ref-name>jdbc/myPool</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
    ...
</web-app>

3。从我的代码访问我的数据源

然后,您可以使用DataSource

访问JNDI
Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myPool");
Connection conn = ds.getConnection();

4。部署JDBC驱动程序

您的JDBC驱动程序需要在Tomcat的Common ClassLoader中可用,因为它是一个全局资源,因此您需要将驱动程序的jar放在tomcat/lib

JNDI here

中有关Tomcat数据源的更多详细信息

答案 2 :(得分:-1)

您可以使用如下所示的单身类:

public class DBHandler{

    private static Connection conn = null;

    private DBHandler(String connString){
        Class.forName("com.mysql.jdbc.Driver"); 
        conn=DriverManager.getConnection(connString);    
    }

    public static void getConnection(String connString) {
        if (conn == null)
            new DBHandler(String connString);
        return conn;
    }
}

它将在第一次DBHandler.getConnection()调用期间创建连接,并将其缓存在conn字段中。稍后DBHandler.getConnection()次调用将返回此缓存连接。

如果您的应用程序需要处理大量数据库请求,请阅读有关连接池的信息。