【问题标题】:Java Store a Connection in a HashMapJava 在 HashMap 中存储连接
【发布时间】:2020-09-12 08:47:03
【问题描述】:

我希望构建一个通用的 HashMap 来存储一些东西,其中之一是连接对象。这是一个简化的例子:

初始化函数

public Map<Object, Object> genObjectInit() {

   Map<Object, Object> genObject = new HashMap<Object, Object>();

}

添加一个连接对象(作为例子)

public Map<Object, Object> genObjectConnect(Map<Object, Object> genObject) throws Exception {

   Connection PgSQL;

   try {
      Class.forName("org.postgresql.Driver");
      PgSQL = DriverManager.getConnection ( /* yes */ );
   } catch(Exception log) {
      throw new Exception("failed to connect");
   }

   genObject.put("PgSQL", PgSQL);

   return genObject;

}

测试它是否正常工作

public void genObjectTest(Map<Object, Object> genObject) {

   genObject.put("Yes", "Yes");

   System.out.println(genObject.get("PgSQL").getClass().getName());
   genObject.get("PgSQL").close();


}

将 Connection 添加到 HashMap 似乎正在工作,genObject.get("PgSQL").getClass().getName() 的输出给了我org.postgresql.jdbc.PgConnection,我认为这意味着它仍然是一个 Connection 对象,但调用 genObject.get("PgSQL").close(); 会崩溃

/yes/yes/yes.java:45: error: cannot find symbol
   genObject.get("PgSQL").close();
                         ^

我在这里显然误解了一些东西。如何使用一般存储的 Connection(或等效但同样独特的对象)的功能?

【问题讨论】:

  • 您将值存储为Object 和Object 没有close 方法。也许使用Connection 类型作为地图中的值?
  • 你是对的,将类型更改为 Connection 有效,但这是否意味着 HashMap 不是动态的?
  • 您可以在调用 close 方法之前将对象类型转换为Connection
  • 只是为了知识,您为什么要自己管理这些数据库连接而不是委托hibernate/jpa 这样做?如果您正在考虑自己实现它,您最好考虑构建一个连接池(如Apache Commons DBCP, HirakiCP, C3CP),其中包含大小、最大大小、连接的 TTL 等属性的完整设置。另一点是实现缓存,至少是一级缓存。祝你好运;)
  • 这只是我知道的方式,我对hibernate/jpa很陌生

标签: java object hashmap


【解决方案1】:

使用Map&lt;Object, Object&gt; 可以让您访问在 Object 类中声明的方法,因为当您从地图中检索对象时

public void genObjectTest(Map<Object, Object> genObject) {

   genObject.put("Yes", "Yes");

   System.out.println(genObject.get("PgSQL").getClass().getName());
   genObject.get("PgSQL").close();


}

然后genObject.get("PgSQL") 的结果存储在 Object 类的一个实例中。

根据您的用例,您可以尝试使用具有特定类型的 Java 泛型并将您的 Map 声明为 Map&lt;Object, Connection&gt;,如下所示:

    public void genObjectTest(Map<Object, Connection> genObject) {

        genObject.put("Yes", connectionInstance);

        System.out.println(genObject.get("PgSQL").getClass().getName());
        Connection pgSQL = genObject.get("PgSQL");
        try {
            pgSQL.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

这为您提供了许多优势,其中之一是编译时类型检查,或者您最终可以在检索对象时进行类型转换,例如:

public void genObjectTest(Map<Object, Object> genObject) {

    genObject.put("Yes", "Yes");

    System.out.println(genObject.get("PgSQL").getClass().getName());
    Object connectionAsObject = genObject.get("PgSQL");
    if (connectionAsObject instanceof Connection) {
        Connection pgSQL = (Connection) connectionAsObject;
        try {
            pgSQL.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

然而,这是不太受欢迎的解决方案。使用第一个解决方案,即具有特定类型的 java 泛型,另一个优点是您不必进行这种类型转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多