3

这是我的 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 文件中提供 url、用户名和密码呢?

4

3 回答 3

7

您可以使用 DataSource 来获取 Connection 之类的

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();
于 2012-05-16T06:21:53.683 回答
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;
于 2012-05-16T06:23:22.257 回答
0

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

因此,您无需在任何地方重新输入您的连接信息。只需让容器将一个注入EntityManager到您的 servlet 中(假设您使用 EE 6 和CDI)或创建类似DAO的东西(没有 EE6)。

您可能想看看这个在 JBoss 上使用 Hibernate 的JPA 示例。

于 2012-05-16T06:19:16.140 回答