hibernate提供org.hibernate.connection.ConnectionProvider获取jdbc连接,ConnectionProvider实现类包括
DriverManagerConnectionProvider
DateSourceConnectionProvider
UserSuppliedConnectionProvider
C3P0ConnectionProvider,ProxoolConnectionProvider
简要说说这些实现
DriverManagerConnectionProvider用List维护连接,当jvm调用finalize方法时,关闭掉集合中的所有连接,并清空集合
getConnection
如果集合中有,则拿到最新的那个连接;如果没有,DriverManager获取连接
closeConnection
如果集合中连接的数量已经等于配置中指定的poolSize,则关闭此连接;如果没有则放入集合
下
DateSourceManagerConnectionProvider通过jndi查找数据源配置中的hibernate.jndi.class和hibernate.jndi.url用于初始化javax.naming.InitialContext常用jndi配置hibernate.connection.datasource指定数据源的名称
getConnection
通过javax.sql.DataSource,getConnection获取
closeConnection
java.sql.Connection.close
C3P0ConnectionProvider使用c3p0实现的javax.sql.DataSourcec3p0
ProxoolConnectionProvider使用proxool实现proxool
UserSuppliedConnectionProvider用户继承此类实现自己的连接提供者
至于使用哪种,由org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider决定
newConnectionProvider描述如下
如果hibernate.connection.provider_class不为空,使用实例化后的类
如果发现hibernate.connection.datasource,使用DatesourceConnectionProvider
如果发现hibernate.c3p0.*,使用C3P0ConnectionProvider
如果发现hibernate.proxool,使用ProxoolConnectionProvider
如果发现hibernate.connection.url,使用DriverManagerConnectionProvider
否则,返回UserSuppliedConnectionProvider
//$Id: ConnectionProviderFactory.java 7541 2005-07-18 22:37:31Z epbernard $
package org.hibernate.connection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
import java.util.Map;
import java.beans.Introspector;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.cfg.Environment;
import org.hibernate.util.ReflectHelper;
/**
* Instantiates a connection provider given either <tt>System</tt> properties or
* a <tt>java.util.Properties</tt> instance. The <tt>ConnectionProviderFactory</tt>
* first attempts to find a name of a <tt>ConnectionProvider</tt> subclass in the
* property <tt>hibernate.connection.provider_class</tt>. If missing, heuristics are used
* to choose either <tt>DriverManagerConnectionProvider</tt>,
* <tt>DatasourceConnectionProvider</tt>, <tt>C3P0ConnectionProvider</tt> or
* <tt>DBCPConnectionProvider</tt>.
* @see ConnectionProvider
* @author Gavin King
*/
public final class ConnectionProviderFactory {
private static final Log log = LogFactory.getLog(ConnectionProviderFactory.class);
/**
* Instantiate a <tt>ConnectionProvider</tt> using <tt>System</tt> properties.
* @return ConnectionProvider
* @throws HibernateException
*/
public static ConnectionProvider newConnectionProvider() throws HibernateException {
return newConnectionProvider( Environment.getProperties() );
}
/**
* Instantiate a <tt>ConnectionProvider</tt> using given properties.
* Method newConnectionProvider.
* @param properties hibernate <tt>SessionFactory</tt> properties
* @return ConnectionProvider
* @throws HibernateException
*/
public static ConnectionProvider newConnectionProvider(Properties properties) throws HibernateException {
return newConnectionProvider( properties, null );
}
/**
* Instantiate a <tt>ConnectionProvider</tt> using given properties.
* Method newConnectionProvider.
* @param properties hibernate <tt>SessionFactory</tt> properties
* @Param connectionProviderInjectionData object to be injected in the conenction provided
* @return ConnectionProvider
* @throws HibernateException
*/
public static ConnectionProvider newConnectionProvider(Properties properties, Map connectionProviderInjectionData) throws HibernateException {
ConnectionProvider connections;
String providerClass = properties.getProperty(Environment.CONNECTION_PROVIDER);
if ( providerClass!=null ) {
try {
log.info("Initializing connection provider: " + providerClass);
connections = (ConnectionProvider) ReflectHelper.classForName(providerClass).newInstance();
}
catch (Exception e) {
log.fatal("Could not instantiate connection provider", e);
throw new HibernateException("Could not instantiate connection provider: " + providerClass);
}
}
else if ( properties.getProperty(Environment.DATASOURCE)!=null ) {
connections = new DatasourceConnectionProvider();
}
else if ( properties.getProperty(Environment.C3P0_MAX_SIZE)!=null ) {
connections = new C3P0ConnectionProvider();
}
else if (
properties.getProperty(Environment.PROXOOL_XML)!=null ||
properties.getProperty(Environment.PROXOOL_PROPERTIES)!=null ||
properties.getProperty(Environment.PROXOOL_EXISTING_POOL)!=null
) {
connections = new ProxoolConnectionProvider();
}
else if ( properties.getProperty(Environment.URL)!=null ) {
connections = new DriverManagerConnectionProvider();
}
else {
connections = new UserSuppliedConnectionProvider();
}
if ( connectionProviderInjectionData != null && connectionProviderInjectionData.size() != 0 ) {
//inject the data
try {
BeanInfo info = Introspector.getBeanInfo( connections.getClass() );
PropertyDescriptor[] descritors = info.getPropertyDescriptors();
int size = descritors.length;
for (int index = 0 ; index < size ; index++) {
String propertyName = descritors[index].getName();
if ( connectionProviderInjectionData.containsKey( propertyName ) ) {
Method method = descritors[index].getWriteMethod();
method.invoke( connections, new Object[] { connectionProviderInjectionData.get( propertyName ) } );
}
}
}
catch (IntrospectionException e) {
throw new HibernateException("Unable to inject objects into the conenction provider", e);
}
catch (IllegalAccessException e) {
throw new HibernateException("Unable to inject objects into the conenction provider", e);
}
catch (InvocationTargetException e) {
throw new HibernateException("Unable to inject objects into the conenction provider", e);
}
}
connections.configure(properties);
return connections;
}
// cannot be instantiated
private ConnectionProviderFactory() { throw new UnsupportedOperationException(); }
/**
* Transform JDBC connection properties.
*
* Passed in the form <tt>hibernate.connection.*</tt> to the
* format accepted by <tt>DriverManager</tt> by triming the leading "<tt>hibernate.connection</tt>".
*/
public static Properties getConnectionProperties(Properties properties) {
Iterator iter = properties.keySet().iterator();
Properties result = new Properties();
while ( iter.hasNext() ) {
String prop = (String) iter.next();
if ( prop.indexOf(Environment.CONNECTION_PREFIX) > -1 && !SPECIAL_PROPERTIES.contains(prop) ) {
result.setProperty(
prop.substring( Environment.CONNECTION_PREFIX.length()+1 ),
properties.getProperty(prop)
);
}
}
String userName = properties.getProperty(Environment.USER);
if (userName!=null) result.setProperty( "user", userName );
return result;
}
private static final Set SPECIAL_PROPERTIES;
static {
SPECIAL_PROPERTIES = new HashSet();
SPECIAL_PROPERTIES.add(Environment.DATASOURCE);
SPECIAL_PROPERTIES.add(Environment.URL);
SPECIAL_PROPERTIES.add(Environment.CONNECTION_PROVIDER);
SPECIAL_PROPERTIES.add(Environment.POOL_SIZE);
SPECIAL_PROPERTIES.add(Environment.ISOLATION);
SPECIAL_PROPERTIES.add(Environment.DRIVER);
SPECIAL_PROPERTIES.add(Environment.USER);
}
}
分享到:
相关推荐
chromedriver-win64-136.0.7059.0.zip
python学习一些项目和资源
python学习资源
python学习资源
python学习教程
python学习教程
【毕业设计】java-springboot+vue会议管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
内有各个系统的版本全了
分数阶模型辨识,分数阶模型辨识
大数据基于python的电影天堂数据可视化(源码+配套文档) 系统功能: 登录 、首页 、电影数据管理 、我的信息 关键技术:Python、Django、Mysql、Hadoop、Scrapy、Vue、B/S 技术支持:已测试可正常运行,调试问题可联系客服有偿解决。 更多项目:3000+优质源码,支持【定制】、修改、部署、讲解和文档。
【毕业设计】java-springboot+vue疾病防控综合系统的设计与实现源码(完整前后端+mysql+说明文档+LunW).zip
【毕业设计】java-springboot-vue家具销售电商平台实现源码(完整前后端+mysql+说明文档+LunW).zip
134dfffffffffffffffffffffffffffffff
代码说明: 设置结束时间:通过new Date().getTime()获取当前时间戳,并加上10分钟的毫秒数(10 * 60 * 1000),得到倒计时的结束时间。 更新倒计时:updateCountdown函数计算当前时间与结束时间的差值,并将其转换为分钟和秒数。 显示倒计时:通过console.log输出剩余时间,格式为“剩余时间:X分Y秒”。 停止倒计时:当剩余时间小于或等于0时,清除定时器并输出“时间到!”。 定时器:使用setInterval每秒调用一次updateCountdown函数,实现倒计时的动态更新。 扩展说明: 应用场景:倒计时功能常用于限时抢购、考试计时、活动倒计时等场景。 优化建议:可以将倒计时显示在网页的某个元素中,而不是控制台。例如,使用document.getElementById获取DOM元素并更新其内容。 兼容性:该代码在现代浏览器中均可运行,如果需要兼容旧版浏览器,可以使用var代替const和let。 扩展功能:可以添加声音提示、动画效果等,提升用户体验。
该项目是一个大学生校园兼职平台。该平台使用Java语言开发后台业务逻辑,运用了SpringMVC+Spring+MyBatis框架进行搭建,前台使用jQuery、layUI框架,数据库服务器采用MySQL5.6+对数据进行持久化。其主要功能有:兼职招聘、论坛交流、在线聊天、个人中心、信箱留言、登录注册等功能。
图解AUTOSAR-CP-CommunicationStackTypes逻辑图打包
解释程序的逻辑和变量等等
python学习一些项目和资源
最近在基于大型语言模型(LLM)的多智能体系统(MAS)方面的发展展示了其在处理复杂决策任务方面的显著潜力。然而,现有的框架不可避免地依赖于串行执行范式,即智能体必须完成顺序的LLM规划后才能采取行动。这一基本限制严重影响了实时响应和适应能力,而在动态环境中这些能力至关重要。本文提出了一种新的并行化规划-行动框架,用于基于LLM的MAS,该框架具有可中断执行的双线程架构,支持并发规划和行动。具体而言,我们的框架包含两个核心线程:(1) 由集中式内存系统驱动的规划线程,保持环境状态同步和智能体通信以支持动态决策;以及 (2) 配备全面技能库的行动线程,通过递归分解实现自动化任务执行。在具有挑战性的《我的世界》实验中证明了所提框架的有效性。
基于layui和thinkphp6.0的快速后台开发框架。快速构建完善的管理后台,内置表单、表格的php生成,以及完善的RBAC权限管理