说明:
这是工作的一个实际应用,在此作一下备案、东西不难但容易忘记。里面主要包括
1、XML配置信息加载
2、单例模式使用
3、ThreadLocal使用,不管在此意义不大
4、WebLogic数据源使用,获取不到数据源将使用JDBC连接
一、XML配置
<?xml version="1.0" encoding="UTF-8"?>
<config>
<!-- JDBC的配置信息 -->
<db-info>
<driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
<url>jdbc:oracle:thin:@localhost:1521:orcl</url>
<user-name>name</user-name>
<password>password</password>
</db-info>
<!-- 数据源的配置信息 -->
<datasoure-info>
<initContextFactory>weblogic.jndi.WLInitialContextFactory</initContextFactory>
<provider-url>jdbc:oracle:thin:@localhost:1521:orcl</provider-url>
<jndi-name>jndiName</jndi-name>
</datasoure-info>
</config>
二、POJO用来存读到的配置属性
public class JdbcConfig {
// jdbc配置
private String driverName;
private String userName;
private String password;
private String url;
// weblogic数据源的配置
private String initContextFactory;
private String providerUrl;
private String jndiName;
public String getDriverName() {
return driverName;
}
public void setDriverName(String driverName) {
this.driverName = driverName;
}
................................................
}
三、单例加载配置文件
看到空间的另外一篇博客可以知道,这种单例很显然不是最佳的写法;而且dom4j的解析也有一点冗余哦,不过影响不大。
public class XmlConfigReader {
// 懒汉式(用的时候再创建),延迟加载
private static XmlConfigReader instance = null;
// 保存jdbc相关配置信息
private JdbcConfig jdbcConfig = new JdbcConfig();
// 构造方法让其private,这就不让外界利用new创建此类实例
private XmlConfigReader() {
SAXReader reader = new SAXReader();
// 从用来加载类的搜索路径打开具有指定名称的资源,以读取该资源。此方法通过系统类加载器
InputStream in = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("dbsource.xml");
try {
Document doc = reader.read(in);
// 取得jdbc相关配置信息
Element driverNameElt = (Element) doc
.selectObject("/config/db-info/driver-name");
Element urlElt = (Element) doc.selectObject("/config/db-info/url");
Element userNameElt = (Element) doc
.selectObject("/config/db-info/user-name");
Element passwordElt = (Element) doc
.selectObject("/config/db-info/password");
// 取得WebLogic数据源的相关信息
Element initContextFactory = (Element) doc
.selectObject("/config/datasoure-info/initContextFactory");
Element providerUrl = (Element) doc
.selectObject("/config/datasoure-info/provider-url");
Element jndiname = (Element) doc
.selectObject("/config/datasoure-info/jndi-name");
// jdbc取得相关的配置
jdbcConfig.setDriverName(driverNameElt.getStringValue());
jdbcConfig.setUserName(userNameElt.getStringValue());
jdbcConfig.setPassword(passwordElt.getStringValue());
jdbcConfig.setUrl(urlElt.getStringValue());
// 数据源取得相关的配置
jdbcConfig.setInitContextFactory(initContextFactory
.getStringValue());
jdbcConfig.setProviderUrl(providerUrl.getStringValue());
jdbcConfig.setJndiName(jndiname.getStringValue());
} catch (DocumentException e) {
e.printStackTrace();
}
}
// 静态方法访问时,直接访问不需要实例化
public static synchronized XmlConfigReader getInstance() {// synchronized表示同时只能一个线程进行实例化
if (instance == null) {// 如果两个进程同时进入时,同时创建很多实例,不符合单例
instance = new XmlConfigReader();
}
return instance;
}
public JdbcConfig getJdbcConfig() {
return jdbcConfig;
}
}
四、数据库的连接
public class Conn {
private static final ThreadLocal<Connection> connectLocal = new ThreadLocal<Connection>();
static JdbcConfig jdbcConfig = XmlConfigReader.getInstance()
.getJdbcConfig();
public static Connection getJDBCConnection() {
Connection conn = (Connection) connectLocal.get(); // 获得连接
try {
if (conn == null) { // 如果连接不存在,就创建一个新的连接
Class.forName(jdbcConfig.getDriverName().trim());
conn = DriverManager.getConnection(jdbcConfig.getUrl().trim(),
jdbcConfig.getUserName(), jdbcConfig.getPassword()
.trim());
connectLocal.set(conn); // 保存到ThreadLocal中
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static Connection getConnection() {
Connection conn = (Connection) connectLocal.get(); // 获得连接
Hashtable<String, String> ht = new Hashtable<String, String>();
ht.put(Context.INITIAL_CONTEXT_FACTORY, jdbcConfig
.getInitContextFactory().trim());
ht.put(Context.PROVIDER_URL, jdbcConfig.getProviderUrl().trim());
Context ctx = null;
try {
ctx = new InitialContext(ht);
DataSource ds = (DataSource) ctx.lookup(jdbcConfig.getJndiName()
.trim());
conn = ds.getConnection();
connectLocal.set(conn); // 保存到ThreadLocal中
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (ctx != null) {
ctx.close();
}
} catch (NamingException e) {
e.printStackTrace();
}
}
if (conn == null) {
conn = getJDBCConnection(); //JDBC连接
}
return conn;
}
public static void CloseConnection() { // 如果这样做,ThreadLocal的性能就不能得到体现了.
Connection conn = (Connection) connectLocal.get();
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace(); // 出现异常建议上抛,在最上层做提示处理.
} finally {
connectLocal.remove();
}
}
}
这里如何数据源里面获得的conn是null,将调用JDBC的连接。
分享到:
相关推荐
4. **配置数据源**:若应用需要连接数据库,需在WebLogic中配置JDBC数据源,包括驱动类、URL、用户名和密码等信息。 5. **集群与负载均衡**:在企业级环境中,可能需要配置WebLogic集群以实现高可用性和负载均衡,...
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
wrf转mp4播放器1.1.1
内容概要:本文档详细介绍了如何在Simulink中设计一个满足特定规格的音频带ADC(模数转换器)。首先选择了三阶单环多位量化Σ-Δ调制器作为设计方案,因为这种结构能在音频带宽内提供高噪声整形效果,并且多位量化可以降低量化噪声。接着,文档展示了具体的Simulink建模步骤,包括创建模型、添加各个组件如积分器、量化器、DAC反馈以及连接它们。此外,还进行了参数设计与计算,特别是过采样率和信噪比的估算,并引入了动态元件匹配技术来减少DAC的非线性误差。性能验证部分则通过理想和非理想的仿真实验评估了系统的稳定性和各项指标,最终证明所设计的ADC能够达到预期的技术标准。 适用人群:电子工程专业学生、从事数据转换器研究或开发的技术人员。 使用场景及目标:适用于希望深入了解Σ-Δ调制器的工作原理及其在音频带ADC应用中的具体实现方法的人群。目标是掌握如何利用MATLAB/Simulink工具进行复杂电路的设计与仿真。 其他说明:文中提供了详细的Matlab代码片段用于指导读者完成整个设计流程,同时附带了一些辅助函数帮助分析仿真结果。
国网台区终端最新规范
《基于YOLOv8的智慧农业水肥一体化控制系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
GSDML-V2.33-LEUZE-AMS3048i-20170622.xml
微信小程序项目课程设计,包含LW+ppt
微信小程序项目课程设计,包含LW+ppt
终端运行进度条脚本
幼儿园预防肺结核教育培训课件资料
python,python相关资源
《基于YOLOv8的智慧校园电动车充电桩状态监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
deepseek 临床之理性软肋.pdf
SM2258XT量产工具(包含16种程序),固态硬盘量产工具使用
RecyclerView.zip
水务大脑让水务运营更智能(23页)
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
大众捷达轿车前轮制动器设计
《基于YOLOv8的智能工厂压缩空气泄漏检测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计