繁体   English   中英

为Web应用程序获取DBConnection的正确方法

[英]Proper way of obtaining the DBConnection for a Web Application

我们有一个Web应用程序,它将为1000多个并发用户提供服务。当前,用于获取DB连接的Utility类是

public static Connection getDBConnection()
       {
          Connection conn = null;
          try
          {
             InitialContext ctx = new InitialContext();
             DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalDB");
             try
             {
                conn = ds.getConnection();
             }
             catch ( SQLException sqlEx )
             {
                System.out.println( "cannot get JDBC connection: " + sqlEx ); 
             }
          }
          catch ( NamingException nEx )
          {
             nEx.printStackTrace();
          }
          return conn;
       }

选项2:

 public class DBConnection2 {
    private static DataSource dataSource;
    static {
        try {
              dataSource = (DataSource) new InitialContext().lookup("java:/comp/env/jdbc/MyLocalDB");
        } catch (NamingException e) {
            try {
                throw new Exception("'jndifordbconc' not found in JNDI",e);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    }

    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }

    }

}

请让我知道更好的选择是什么(我想它的第二个操作是查找,因为它是一项昂贵的操作,而我在应用程序中只能执行一次。)

请分享您的看法。

在第二种方法上,您应该确保使用连接池。 否则,用户将不得不等待其他人。

例如,To Tomcat带来了自己的连接池。 或者,如果您不使用Tomcat,则可以看看C3p0:JDBC DataSources / Resource Pools

请参阅: 实例化和配置ComboPooledDataSource

您应该采用第二种方法。 如您所说,您无需一直在JNDI中查找数据源。

我假设您使用的是tomcat-jdbc项目提供的池化数据源,否则性能将很糟糕。

第二个选项仅在加载类时初始化dataSource一次,然后在所有DBConnection2实例之间共享它。 每次调用getDBConnection()时,第一个选项都会初始化一个新的DataSource实例。 因此,第二种选择具有更好的性能。 但是请注意连接释放问题。 如果选择第一个选项,请确保关闭连接。 我更喜欢使用框架来处理数据库连接,例如Spring JDBChttp : //docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html

暂无
暂无

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

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