java配置连接池时不能得到一个DataSource实例,高手请进!

java配置连接池时不能得到一个DataSource实例,高手请进!,第1张

javaxsqlDataSource ds = (javaxsqlDataSource)ctxlookup("java:comp/env/jdbc/news");

把这句分开写看看。

Context ic = new InitialContext();

Context env = (Context) iclookup("java:comp/env");

DataSource ds = (DataSource) envlookup("jdbc/news");

DruidDataSource为整个链接池的基础入口,实现了JDBC的Datasource

参数用来控制锁的公平性,默认false非公平

configFromPropety 方法从配置中,初始化各种配置属性,属性及其多,浏览一下即可

看一下super的构造函数,定义了锁的状态

然后调用init()方法初始化

init又非常得长,主要做了如下几件事情:

主要链路

getConnectionDirect(maxWaitMillis)->

getConnectionInternal(maxWaitMillis)->

createPhysicalConnection()->

DruidConnectionHolder ->pollLast()

失败重新创建一个->new DruidConnectionHolder(this, pyConnInfo);

最后返回通过Holder获取的connection new DruidPooledConnection(holder);

生成DataSourceId的时候,用了几个原子类来记录偏移量,后续看到再标注

看源码的方法,可以从Test单元测试类开始

DruidDataSourceTest 初始化到关闭的流程走了一遍

DriverManager跟DataSource获取getConnection最直接的不同是:

DriverManager是直接和数据库地层连接

DataSource是用数据库连接池进行封装好获得连接的,访问量大的项目最好用连接池。

DataSource 接口由驱动程序供应商实现。共有三种类型的实现:

基本实现 - 生成标准的 Connection 对象

连接池实现 - 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。

分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。此实现与中间层事务管理器一起使用,大多数情况下总是与连接池管理器一起使用。

DataSource 对象的属性在必要时可以修改。例如,如果将数据源移动到另一个服务器,则可更改与服务器相关的属性。其优点在于,由于可以更改数据源的属性,所以任何访问该数据源的代码都无需更改。

通过 DataSource 对象访问的驱动程序本身不会向 DriverManager 注册。通过查找 *** 作获取 DataSource 对象,然后使用该对象创建 Connection 对象。使用基本的实现,通过 DataSource 对象获取的连接与通过 DriverManager 设施获取的连接相同。

----------------------------------------------

public class DriverManager extends Object

管理一组 JDBC 驱动程序的基本服务。

注:DataSource 接口是 JDBC 20 API 中的新增内容,它提供了连接到数据源的另一种方法。使用 DataSource 对象是连接到数据源的首选方法。

作为初始化的一部分,DriverManager 类会尝试加载在 "jdbcdrivers" 系统属性中引用的驱动程序类。这允许用户定制由他们的应用程序使用的 JDBC Driver。

在调用 getConnection 方法时,DriverManager 会试着从初始化时加载的那些驱动程序以及使用与当前 applet 或应用程序相同的类加载器显式加载的那些驱动程序中查找合适的驱动程序。

你指的是JDBC连接池连接超时失效问题的问题吧?

这是因为mysql默认保持连接的时间是8小时,如果这个连接在8小时内无人访问的话,就会关闭这个连接。但是连接池设计的时候没有考虑到这个问题,还把失效的连接拿出去就会导致出现异常。

解决方法:

1、创建一个线程每隔一段时间就测试一下连接,保持连接时最新的,永远达不到8小时无人访问。

2、连接池取连接的时候判定是否这个连接有效。

[java] view plain copy

if (connisValid(1000)){

return conn;

}

else{

return thisCreateConnection();

}

3、不使用连接池,直接拿了就用,用了就还。

连接池的概念:

用池来管理Connection,这可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。

JDBC数据库连接池接口(DataSource):

Java为数据库连接池提供了公共的接口:javaxsqlDataSource,各个厂商可以让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!

这个包应该是

笔者自己创建获取bean的包

实际datasource

来自

applicationcontext里面的datasource

所以你也可以自定义获取datasource

方法

通过applicationcontext获取datasource

很大可能是没有导入jar 包

给你推荐一种写法:

把一个A类继承BasicDataSource 类

public A(){

thissetDriverClassName("");

thissetUsername("");

thissetPassword("");

thissetUrl("");// --------------- 这个是 jdbc 最基本的 链接属性 你配好就可以了

}

DataSource dataSource = new A();

就可以得到一个DataSource 的实例了 后面就可以调用了

//---------- 这是一个最简单的 DButils 的DataSource 应用了

以上就是关于java配置连接池时不能得到一个DataSource实例,高手请进!全部的内容,包括:java配置连接池时不能得到一个DataSource实例,高手请进!、Druid连接池源码解析(1)DruidDataSource、java中DriverManager跟DataSource获取getConnection有什么不同等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9342252.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存