为 Web 应用程序获取 DBConnection 的正确方法
Proper way of obtaining the DBConnection for a Web Application
我们有一个 Web 应用程序可以为 1000 多个并发用户提供服务
当前,用于获取数据库连接的实用程序 class 是
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.
你应该采用第二种方法。正如您所说,您不需要一直在 JNDI 中查找数据源。
我假设您正在使用 tomcat-jdbc 项目提供的合并数据源,否则性能会很糟糕。
第二个选项仅在加载 class 时初始化 dataSource
一次,然后在所有 DBConnection2
实例中共享。每次调用 getDBConnection()
时,第一个选项都会初始化一个新的 DataSource
实例。因此,第二个选项具有更好的性能。但请注意连接释放问题。如果您选择第一个选项,请确保关闭连接。我更喜欢使用框架来处理数据库连接,例如 Spring JDBC
: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html
我们有一个 Web 应用程序可以为 1000 多个并发用户提供服务 当前,用于获取数据库连接的实用程序 class 是
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.
你应该采用第二种方法。正如您所说,您不需要一直在 JNDI 中查找数据源。
我假设您正在使用 tomcat-jdbc 项目提供的合并数据源,否则性能会很糟糕。
第二个选项仅在加载 class 时初始化 dataSource
一次,然后在所有 DBConnection2
实例中共享。每次调用 getDBConnection()
时,第一个选项都会初始化一个新的 DataSource
实例。因此,第二个选项具有更好的性能。但请注意连接释放问题。如果您选择第一个选项,请确保关闭连接。我更喜欢使用框架来处理数据库连接,例如 Spring JDBC
: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html