简单来说,就是获取数据库连接的一个通用接口, 常见的dbcp,c3p0,druid都是DataSource的实现.
NutDao也选用DataSource作为获取数据库连接的方式, 且只调用其无参数的getConnection()方法,也是大部分数据库连接池唯一支持的方法.
提醒一下, DataSource只是接口,不等于连接池
NutDao不挑剔任何连接池/DataSource实现,只要实现了DataSource接口就行,不存在是否支持"XXXX连接池"的问题
var ioc = {
dao : {
type : "org.nutz.dao.impl.NutDao",
args : [{refer:"dataSource"}]
},
dataSource : {
type : "org.nutz.dao.impl.SimpleDataSource",
fields : {
jdbcUrl : 'jdbc:postgresql://localhost:5432/mydatabase',
username : 'demo',
password : '123456'
}
}
}
如何使用这些配置? 请看文章末尾.
国产精品连接池,淘宝温少诚意出品,带强大的监控功能哦, 推荐1.0.25+
{ dataSource : { type : "com.alibaba.druid.pool.DruidDataSource", events : { depose : 'close' }, fields : { url : "jdbc:postgresql://localhost:5432/mydatabase", username : "enzozhong", password : "123", maxWait: 15000, // 若不配置此项,如果数据库未启动,druid会一直等可用连接,卡住启动过程 defaultAutoCommit : false // 提高fastInsert的性能 } } }
{
dataSource : {
type : "org.apache.commons.dbcp.BasicDataSource",
events : {
depose : 'close'
},
fields : {
driverClassName : 'org.postgresql.Driver',
url : 'jdbc:postgresql://localhost:5432/mydatabase',
username : 'demo',
password : '123456'
}
}
}
{
dataSource : {
type : "com.mchange.v2.c3p0.ComboPooledDataSource",
events : {
depose : 'close'
},
fields : {
driverClass : 'org.postgresql.Driver',
jdbcUrl : 'jdbc:postgresql://localhost:5432/mydatabase',
user : 'demo',
password : '123456'
}
}
}
{
dataSource : {
type : "org.logicalcobwebs.proxool.ProxoolDataSource",
fields : {
driver : 'org.postgresql.Driver',
driverUrl : 'jdbc:postgresql://localhost:5432/mydatabase',
user : 'demo',
password : '123456'
}
}
}
不写了,这个大家都懂,不懂的自己去google查. 别跟我说baidu没查到!!
{ dao : { type : "org.nutz.dao.impl.NutDao", args : [{jndi:"jdbc/dataSource"}] } }
指一些不能提供连接池或自定义获取Connection的项目,可以实现如下封装类,代理为DataSource
public class MyDataSource implements DataSource { public Connection getConnection() throws SQLException { // 调用遗留系统中获取数据库连接的方法即可 } // 还有其他一些方法,全部默认实现就可以了,不会调用到. }
{ dao : { type : "org.nutz.dao.impl.NutDao", args : [{refer:"dataSource"}] }, dataSource : { type : "net.wendal.nutzbook.MyDataSource" } }
推荐使用org.nutz.dao.util.DaoUp类,非Mvc环境下的全生命周期Dao工具.下面描述的是纯手工创建的代码.
//创建dataSource, 代码仅供演示,实际使用的话必须单例或使用DaoUp类(推荐) SimpleDataSource ds = new SimpleDataSource(); ds.setUrl("jdbc:postgresql://localhost:5432/mydatabase"); ds.setUsername("demo"); ds.setPassword("123456"); Dao dao = new NutDao(ds);//实际使用的话必须单例或使用DaoUp类(推荐) dao.create(User.class, true); dao.insert(User.create("wendal","123456")); //.... ... ... //所有操作都已经完成,关闭连接池,退出系统 ds.close(); return; //额外提醒,NutDao是线程安全的,请不要多次创建NutDao,除非你有多个DataSource
//将配置信息保存到dao.js,并存放于src文件夹下. 代码仅供演示,实际使用的话必须单例 Ioc ioc = new NutIoc(new JsonLoader("dao.js")); DataSource ds = ioc.get(DataSource.class); Dao dao = new NutDao(ds); //如果已经定义了dao,那么改成dao = ioc.get(Dao.class); dao.create(User.class, true); dao.insert(User.create("wendal","123456")); ioc.depose(); //关闭Ioc容器
//将配置信息保存到dao.xml,并存放于src文件夹下. 代码仅供演示,实际使用的话必须单例 Ioc ioc = new NutIoc(new XmlIocLoader("dao.xml")); DataSource ds = ioc.get(DataSource.class); Dao dao = new NutDao(ds); //如果已经定义了dao,那么改成dao = ioc.get(Dao.class); dao.create(User.class, true); dao.insert(User.create("wendal","123456")); ioc.depose(); //关闭Ioc容器
public Dao getDao() { // 无论改方法被调用一次还是N次, 均为错误!! Ioc ioc = new NutIoc(new JsonLoader("ioc/dao.js")); // 反复创建ioc容器 return ioc.get(Dao.class); //方法返回后, ioc必然被gc, 从而触发ioc的depose事件,导致DataSource关闭! }
private static Ioc ioc;
public Dao getDao() { // 暂不考虑线程同步的问题
if (ioc == null)
ioc = new NutIoc(new JsonLoader("ioc/dao.js"));
return ioc.get(Dao.class);
}
// 在request作用域内 public Dao getDao() { Mvcs.getIoc().get(Dao.class); } // 在request作用域之外 public Dao getDao() { Mvcs.ctx().getDefaultIoc().get(Dao.class); }