2017-05-26 64 views
0

我正在学习有关JDBC连接池,这听起来很容易用JNDI得到DataSource实例:如何处理连接池和DAO?

DataSource ds = (DataSource)ctx.lookup("jdbc/myDB"); 

所有我发现显示教程此代码只有一个对象,但我的问题是如何使用DataSource当我有几个DAO对象需要从数据库中获取数据。

  1. 它是确定对每一个新DAO对象的构造函数中使用上面的代码,用于连接池?我认为每次都会返回相同的DataSource,就像Dictionary Singleton会做的一样,持有一个DataSource并返回它,或者我错了,每次都会返回一个不同的DataSource并使用不同的池,从而破坏我的目的?

  2. 我应该认为DataSource在辛格尔顿和只运行JNDI搜索一次或者是搜索开销忽略不计,这是一个愚蠢的优化?

+0

你有没有试过https://commons.apache.org/proper/commons-dbcp/或https://brettwooldridge.github.io/HikariCP/?它们提供开箱即用的连接池功能,无需重新编写。对不起,可能不是你的问题的答案。只是想过让你知道。祝你好运! – harshavmb

+0

我将使用tomcat 8内部的解决方案,但它根本不涉及这个问题,不过谢谢 – mFeinstein

回答

1
  1. 它是确定使用上面的连接池每个新DAO对象的构造函数的代码?我认为每次都会返回相同的DataSource,就像Dictionary Singleton会做的一样,持有一个DataSource并返回它,或者我错了,每次都会返回一个不同的DataSource并使用不同的池,从而破坏我的目的?

应该每次都返回相同的DataSource对象。如果它不是字面上相同的对象,那么它应该至少共享相同的底层连接池。

  • 我应该认为数据源在一个Singleton,只有运行JNDI查找一次或者是搜索开销忽略不计,这是一个愚蠢的优化?
  • JNDI的搜索开销相比,在远程数据库上执行操作是可以忽略不计,所以没有必要缓存DataSource对象。

    +0

    人们是如何在DAO上使用它的?还是有其他一些着名的模式? – mFeinstein

    +0

    首先,我应该问,您是在Java EE应用服务器上运行还是不运行? –

    +0

    我在tomcat 8上运行...但为什么这很重要?这不应该与带下划线的平台分离吗? – mFeinstein