【发布时间】: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很陌生