【问题标题】:Obtaining connection to database in JBoss?在 JBoss 中获取到数据库的连接?
【发布时间】:2012-05-16 06:15:33
【问题描述】:

这是我的 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、用户名和密码?

【问题讨论】:

    标签: java postgresql servlets jboss


    【解决方案1】:

    你可以使用 DataSource 来获取 Connection like

    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();
    

    【讨论】:

    • "java.sql.Connection con = ds.getConnection();"。每次调用这个函数,都会返回一个不同的连接对象?
    • 从系统的角度来看,“否:不一定”。使用 DS 而不是 JDBC 连接的另一个优点是,使用 DS 允许您利用应用服务器的连接池。
    • @Satya "javax.naming.Context ctx = (javax.naming.Context) ic.lookup("java:");"这条线在哪里进行查找?第三行在 PostGres-ds.xml 文件中进行查找。对吗?
    • 1.在命名树中获取 initialContext 2. 通过在初始上下文中查找“java:”获取 java 分支 3.通过在“java:”的分支中查找“postgresDS”获取数据源
    • @Satya 你能指定完成这些查找的文件吗?例如 Postgre-ds.xml
    【解决方案2】:

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

    您的应用通常会选择其中的一种。在您的情况下,请使用数据源。

    这是一个很好的 sn-p,它说明了两种方法:使用 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;
    

    【讨论】:

      【解决方案3】:

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

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

      您可能想看看this JPA example 在 JBoss 上使用 Hibernate。

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 2010-10-23
        • 2012-12-08
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多