繁体   English   中英

创建数据库连接的最佳方法

[英]Best way for creating database connections

在Java应用程序中创建数据库连接的最佳方法是什么? 使用Singleton,静态方法,服务定位器,连接池还是其他什么?

请您告诉我上述每种方法的优缺点?

如果您的应用程序适用于多个连接,则首选使用连接池。 它已经在Java中实现,您可以轻松使用它。 这个在使用tomcat的web应用程序中使用池的示例(如果你编写web-app,你也可以使用tomcat的池,它会更好)

package usepool;

import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;

/**
*
* @author brainless
*/
public class ConnectionPool {

private static DataSource datasource;
public static String dbURL = "jdbc:mysql://localhost:3306/"
                + "<YourDataBase>?useUnicode=true&useEncoding=true&characterEncoding=UTF-8";
public static String driverClass = "com.mysql.jdbc.Driver";
public static String userName = "root";
public static String password = "password";
public static boolean jmx = true;
public static boolean testIdle = false;
public static boolean testBorrow = true;
public static boolean testReturn = false;
public static int validationInterval = 30000;
public static int timeBetweenEviction = 30000;
public static int maxActive = 100;
public static int initialSize = 10;
public static int maxWait = 10000;
public static int removeAbandonedTimeout = 60;
public static int minEvictableIdle = 30000;
public static int minIdle = 10;
public static boolean logAbandoned = true;
public static boolean removeAbandoned = true;
public static String jdbcInterceptors = "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"
        + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer";

private ConnectionPool() {
}

public static synchronized DataSource getInstance() {
    if (datasource == null) {
        PoolProperties p = new PoolProperties();
        p.setUrl(dbURL);
        p.setDriverClassName(driverClass);
        p.setUsername(userName);
        p.setPassword(password);
        p.setJmxEnabled(jmx);
        p.setTestWhileIdle(testIdle);
        p.setTestOnBorrow(testBorrow);
        p.setTestOnReturn(testReturn);
        p.setValidationInterval(validationInterval);
        p.setTimeBetweenEvictionRunsMillis(timeBetweenEviction);
        p.setMaxActive(maxActive);
        p.setInitialSize(initialSize);
        p.setMaxWait(maxWait);
        p.setRemoveAbandonedTimeout(removeAbandonedTimeout);
        p.setMinEvictableIdleTimeMillis(minEvictableIdle);
        p.setMinIdle(minIdle);
        p.setLogAbandoned(logAbandoned);
        p.setRemoveAbandoned(removeAbandoned);
        p.setJdbcInterceptors(jdbcInterceptors);
        datasource = new DataSource();
        datasource.setPoolProperties(p);
    }
    return datasource;
}

public static synchronized void closePool() {
    if (datasource != null) {
        datasource.close();
    }
}

}

这个班是单身。 要在代码中建立连接,您需要使用类似的东西

import usepool.ConnectionPool;
/* 
* code
*/
connect = ConnectionPool.getInstance().getConnection();

处理连接有两种方法:

  • 每个请求一个连接
  • 按需连接

每个请求一个连接意味着您在进程开始时获得连接,并在结束时返回它。 这对于Web请求来说不是一个好主意,因为这意味着您的应用程序只能处理与可用数据库连接一样多的并发Web请求。 但是,批处理可能是个好主意,您知道只需要N个连接。

按需连接意味着您在准备进行数据库调用时获得连接,然后在数据库调用完成后立即返回。

在这两种情况下,建议使用连接池,但这对于按需连接策略尤其重要,因为您希望连接在返回后保持打开状态,因为打开连接会产生很大的开销。

通常有两种方法来处理连接池:

  • 容器管理
  • 应用管理

容器管理意味着应用程序服务器通过JNDI向应用程序提供连接池。 这就是JBoss通常所做的事情。 如果它存在,你也可以使用这种方法。 否则,您应该使用应用程序托管池。

大多数DI框架将通过一些配置为您提供连接池。 使用连接池确实没有明显的缺点。 java中最常见的两个是DBCP和C3P0,它们都是非常成熟的库。 如果您不使用DI框架,则应查看这些库的入门指南并实施他们的建议。

在大多数Java应用程序中,这比使用连接池要重要得多。 与使用连接池而不是手动管理连接所带来的便利和收益相比,您的问题更多地取决于个人偏好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM