在JBoss中获取与数据库的连接?

时间:2012-05-16 06:15:34

标签: java postgresql servlets jboss

这是我的jboss / deploy / postgres-ds.xml文件。此处给出了连接URL,用户名和密码。如何在servlet中获取与此数据库的连接。

<local-tx-datasource>
        <jndi-name>PostgresDS</jndi-name>
        <connection-url>jdbc:postgresql://localhost:5432/postgres</connection-url>
        <driver-class>org.postgresql.Driver</driver-class>
        <user-name>postgres</user-name>
        <password>qwerty</password>
            <!-- sql to call when connection is created
            <new-connection-sql>some arbitrary sql</new-connection-sql>
            -->

            <!-- sql to call on an existing pooled connection when it is obtained from pool 
            <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
            -->

          <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->

      </local-tx-datasource>

我是否应该在每个servlet中获得这样的连接:

Connection conn =null; // Create connection object
        String database = "postgres"; // Name of database
        String user = "postgres"; //
             String password = "qwerty";
             String url = "jdbc:postgresql://localhost:5432/" + database;
ResultSet rs = null;
             ResultSetMetaData rsm = null;  
 try{
Class.forName("org.postgresql.Driver").newInstance();
//.newInstance()
} catch(Exception e) 
   {
System.err.println(e);
}

try{
conn = DriverManager.getConnection(url, user, password);

}catch(SQLException se) 
{
System.err.println(se);
}

如果必须每次都这样做,那么为什么要在postgres-ds.xml文件中提供网址,用户名和密码?

3 个答案:

答案 0 :(得分:7)

你可以使用DataSource来获取像

这样的连接
javax.naming.Context ic = new javax.naming.InitialContext();
javax.naming.Context ctx = (javax.naming.Context) ic.lookup("java:");
javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup("PostgresDS");
java.sql.Connection con = ds.getConnection();

答案 1 :(得分:2)

否 - 在J2EE应用程序中使用“数据源”(如基于JBoss的应用程序)并打开标准JDBC连接(就像在简单的Java应用程序中那样)或多或少是互斥的。

您的应用通常会执行其中一种操作。在您的情况下,请使用数据源。

这是一个很好的代码片段,用于说明两种方法:使用JNDI数据源,并直接打开JDBC连接:

http://www.javapractices.com/topic/TopicAction.do?Id=127

/** Uses JNDI and Datasource (preferred style).   */
static Connection getJNDIConnection(){
String DATASOURCE_CONTEXT = "java:comp/env/jdbc/blah";

Connection result = null;
try {
  Context initialContext = new InitialContext();
  if ( initialContext == null){
    log("JNDI problem. Cannot get InitialContext.");
  }
  DataSource datasource = (DataSource)initialContext.lookup(DATASOURCE_CONTEXT);
  if (datasource != null) {
    result = datasource.getConnection();
  }
  else {
    log("Failed to lookup datasource.");
  }
}
catch ( NamingException ex ) {
  log("Cannot get connection: " + ex);
}
catch(SQLException ex){
  log("Cannot get connection: " + ex);
}
return result;

答案 2 :(得分:0)

如果您正在使用JBoss,建议您利用所包含的EE API,例如JPA

因此,您无需在任何地方重新键入连接信息。只需让容器向您的servlet注入EntityManager(前提是您使用带有CDI的EE 6)或创建类似DAO(不含EE6)的内容。

您可能希望在JBoss上使用Hibernate查看this JPA example