【问题标题】:JDBC Connection pooling variable context might not have been initializedJDBC 连接池变量上下文可能尚未初始化
【发布时间】:2017-11-18 01:22:14
【问题描述】:

我在 Netbeans 中使用 JNDI 在 Glassfish 服务器中创建了一个 JDBC 连接池 (jdbc/WILLIAMSON),我想在所有 servlet 中使用它,所以不要在每个 servlet 中编写以下代码

     InitialContext context = new InitialContext();
        //The JDBC Data source that we just created
        DataSource datasource = (DataSource) 
         context.lookup("jdbc/WILLIAMSON");
         Connection connection = null;
          connection = ds.getConnection();

我创建了一个类 DBCONN 并尝试在每个 servlet 中调用此类的一个对象,但收到错误“变量上下文可能尚未初始化”。请看我的代码如下:

       public final class DBCONN {    
       private static final InitialContext context;
       private static final DataSource datasource;
        static{              
          try {
              context = new InitialContext();
                 datasource=(DataSource) context.lookup("jdbc/WILLIAMSON");
          } catch (NamingException ex) {
              Logger.getLogger(DBCONN.class.getName()).log(Level.SEVERE, 
          null, ex);
          }
    }
   private DBCONN() {
      //  I am confused how to use this method, pls guide me
    }// ERROR HERE VARIABLE context MIGHT NOT HAVE BEEN INITIALIZED

    public static Connection getConnection() throws SQLException {
    return datasource.getConnection();
    }

    }

我在 servlet HOME.java 中调用 datasource.getConnection()

       DBCONN datasource = new DBCONN();
        Connection connection = null;
        connection = datasource.getConnection();// I am accessing a static 
       method so warning coming accessing static method getConnection(), how 
        to avoid it???

【问题讨论】:

  • 请帮我找到上述问题的答案?

标签: java servlets jdbc connection-pooling


【解决方案1】:
static{
context = new InitialContext(); 
try { 
datasource=(DataSource) context.lookup("jdbc/WILLIAMSON");
} catch (NamingException ex) { 
Logger.getLogger(DBCONN.class.getName()).log(Level.SEVERE, null, ex);            }                                                                          

【讨论】:

  • 您应该修改答案以添加所有详细信息,而不是再回答一次。
  • 静态{ context = new InitialContext();尝试 { datasource=(DataSource) context.lookup("jdbc/WILLIAMSON"); } catch (NamingException ex) { Logger.getLogger(DBCONN.class.getName()).log(Level.SEVERE, null, ex); }
  • 编辑你的答案并添加必要的细节,不要在这里评论!
  • 编辑了我的答案,请试试这个。希望它会起作用。对不起,我是新手
【解决方案2】:

将行改为private static InitialContext context = null;。编译器警告您,在某些情况下,context 可能不会被创建。

【讨论】:

  • 我修改了,但在静态块中出现错误-无法为最终变量上下文赋值
  • @Williamson 删除 final 关键字。
  • 我修改了,在 servlet 错误中,DBCONN() 在 DBCONN 中具有私有访问权限
  • @Williamson 将 private DBCONN() 更改为 public DBCONN()
  • 这里stackoverflow.com/questions/7592056/…它写的是私有的所以我用了..使用公共可能是一些编码泄漏
猜你喜欢
  • 2012-03-25
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多