package com.ejintai.fa.app.integration.jdbc;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor;
public class AutoSelectNativeJdbcExtractor
implements NativeJdbcExtractor, InitializingBean
{
protected Logger logger = Logger.getLogger(getClass());
private NativeJdbcExtractor defaultExtractor;
protected NativeJdbcExtractor jdbcExtractor;
private Map<String, String> extractorClassMapping;
public Map<String, String> getExtractorClassMapping()
{
return this.extractorClassMapping;
}
public void setExtractorClassMapping(Map<String, String> extractorClassMapping) {
this.extractorClassMapping = extractorClassMapping;
}
public NativeJdbcExtractor getDefaultExtractor() {
return this.defaultExtractor;
}
public void setDefaultExtractor(NativeJdbcExtractor defaultExtractor) {
this.defaultExtractor = defaultExtractor;
}
private NativeJdbcExtractor getJdbcExtractor(Object o) {
if (this.jdbcExtractor == null)
{
String objClass = o.getClass().getName();
NativeJdbcExtractor extractor = null;
if (this.extractorClassMapping != null) {
for (String classPrefix : this.extractorClassMapping.keySet()) {
if (objClass.indexOf(classPrefix) != -1)
{
String className = (String)this.extractorClassMapping.get(classPrefix);
try {
this.logger.info("尝试实例化extractor:" + className);
if (className != null) {
Class clz = getClass().getClassLoader().loadClass(className);
if (clz != null) {
extractor = (InitializingBean)clz.newInstance();
break;
}
}
}
catch (Exception e) {
this.logger.info("尝试实例化extractor:" + className + "时失败; 忽略该异常,继续尝试下一个", e);
}
}
}
}
if (extractor == null) {
this.logger.info("使用默认的extractor:" + this.defaultExtractor);
extractor = this.defaultExtractor;
}
synchronized (this) {
if (this.jdbcExtractor == null) {
this.jdbcExtractor = extractor;
}
}
}
return this.jdbcExtractor;
}
public boolean isNativeConnectionNecessaryForNativeStatements()
{
return true;
}
public boolean isNativeConnectionNecessaryForNativePreparedStatements()
{
return true;
}
public boolean isNativeConnectionNecessaryForNativeCallableStatements()
{
return true;
}
public Connection getNativeConnection(Connection con) throws SQLException
{
return getJdbcExtractor(con).getNativeConnection(con);
}
public Connection getNativeConnectionFromStatement(Statement stmt)
throws SQLException
{
return getJdbcExtractor(stmt).getNativeConnectionFromStatement(stmt);
}
public Statement getNativeStatement(Statement stmt) throws SQLException
{
return getJdbcExtractor(stmt).getNativeStatement(stmt);
}
public PreparedStatement getNativePreparedStatement(PreparedStatement ps)
throws SQLException
{
return getJdbcExtractor(ps).getNativePreparedStatement(ps);
}
public CallableStatement getNativeCallableStatement(CallableStatement cs)
throws SQLException
{
return getJdbcExtractor(cs).getNativeCallableStatement(cs);
}
public ResultSet getNativeResultSet(ResultSet rs)
throws SQLException
{
return getJdbcExtractor(rs).getNativeResultSet(rs);
}
public void afterPropertiesSet() throws Exception
{
if (this.defaultExtractor == null)
throw new IllegalArgumentException("AutoSelectNativeJdbcExtractor的defaultExtractor属性必须指定");
}
}
biz-context.xml中:
<!--
自动根据不同的连接池实现选择对应的nativeJdbcExtractor
目前支持commons-dbcp,tomcat-dbcp,tomcat7-pool,WAS Connection Pool
Need JTFA 2.4.0+
-->
<bean id="nativeJdbcExtractor" class="com.ejintai.fa.app.integration.jdbc.AutoSelectNativeJdbcExtractor" >
<property name="defaultExtractor">
<bean class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" />
</property>
<property name="extractorClassMapping">
<map>
<entry key="org.apache.commons.dbcp" value="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"/>
<entry key="org.apache.tomcat.dbcp" value="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"/>
<entry key="com.ibm" value="org.springframework.jdbc.support.nativejdbc.WebSphereNativeJdbcExtractor"/>
</map>
</property>
</bean>
自动匹配原理和规则 该类进行自动匹配的原理是,在获取到(被连接池”包装过的”)Connection对象后,根据连接的”包装类”的包名前缀来判断当前使用的是哪一种连接池,并根据配置的 包名前缀–Extractor实现类 映射关系获取到要使用的NativeJdbcExtractor实现。
经过测试,我们使用如下匹配关系:
包前缀
NativeJdbcExtractor实现
org.apache.commons.dbcp |
CommonsDbcpNativeJdbcExtractor |
org.apache.tomcat.dbcp |
CommonsDbcpNativeJdbcExtractor |
com.ibm |
WebSphereNativeJdbcExtractor |
default(包括tomcat-pool) |
SimpleNativeJdbcExtractor |
同已有代码的使用方式一样,先获取Spring管理的Connection对象,再从中抽取出原始连接
DemoDAOImpl.java:
@Autowired
private NativeJdbcExtractor nativeJdbcExtractor;
//如果使用[原始连接]进行操作,请使用@Transactional注解(在DAO或者更外层的Service,Action上应用),让Spring容器来管理连接的释放,
@Transactional(rollbackFor=DAOException.class)
@Override
public String nativeJdbcTest() throws DAOException {
//使用native connection 调用package
//获取容器管理的[连接池连接],该连接应当由Spring容器关闭, 你应当在DAO或者更外层的Service,Action上使用@Transactional来开启事务
Connection pooledConn = DataSourceUtils.getConnection(super.getDataSource());
try {
//抽取出(原始连接)
Connection conn = nativeJdbcExtractor.getNativeConnection(pooledConn); //该连接不应当关闭
StructDescriptor sd = new StructDescriptor("WEB_FIN_PRM_TYPE", conn);
STRUCT[] struct = new STRUCT[1];
struct[0]=new STRUCT(sd,conn, getTestValueArray());
ArrayDescriptor ad = ArrayDescriptor.createDescriptor("TYPE_PRM_DATA_ARRAY", conn);
ARRAY array = new ARRAY(ad, conn, struct);
OracleCallableStatement callStatement =
(OracleCallableStatement)conn.prepareCall("{call PKG_FINARP_INTERFACE.PROC_INSERT_DATA_TO_PRM(?)}");
callStatement.setARRAY(1, array);
callStatement.executeUpdate();
} catch (SQLException e) {
throw new DAOException(e);
}
return "ok";
}
分享到:
相关推荐
"extractor.exe"是Extractor的主执行文件,当用户双击该文件时,Extractor应用程序将启动并提供用户界面。这个可执行文件负责加载配置、初始化界面、解析用户指令,并调用如ExtractorExt.dll这样的支持文件来执行...
- 用户界面:软件可能提供友好的用户界面,允许用户选择要导出的STDF文件,配置转换选项,比如选择特定记录类型、过滤数据等。 - 输出Excel:最终,用户会得到一个Excel文件,数据以清晰的表格形式呈现,便于...
首先,将Inno Setup安装包拖放到Inno Extractor的界面,然后程序会自动分析并列出所有可提取的文件和目录结构。用户可以选择全部或部分提取,也可以直接定位到特定的文件进行操作。此外,Inno Extractor还支持批处理...
总而言之,RAR Extractor Lite是Mac用户处理RAR文件的理想选择,它提供了直观的操作界面,强大的解压功能,以及无广告的纯净体验。无论是日常的工作还是个人娱乐,这款小巧的应用都能成为你管理压缩文件的强大助手。...
赠送jar包:metadata-extractor-2.6.2.jar; 赠送原API文档:metadata-extractor-2.6.2-javadoc.jar; 赠送源代码:metadata-extractor-2.6.2-sources.jar; 赠送Maven依赖信息文件:metadata-extractor-2.6.2.pom;...
Q3D Extractor是一款由ANSYS公司开发的电磁场分析软件,它主要针对电子设计自动化(EDA)领域中的三维(3D)印刷电路板(PCB)孔洞模型进行电磁特性提取。该软件可以对导电体上的电感、电容等电气参数进行精确计算,...
使用Universal Extractor时,用户首先需要选择要提取的文件,然后程序会自动识别文件类型并提供相应的提取选项。在提取过程中,用户可以选择保存位置,甚至可以指定只提取特定类型的文件或文件夹。此外,Universal ...
- 自动化脚本:通过结合ADB和`android-backup-extractor`,可以自动化备份和恢复流程。 5. **使用教程** 使用`android-backup-extractor`通常包括以下步骤: - 下载并安装项目:从GitHub获取源代码,编译并安装...
2. **灵活选择**:用户可以选择性地提取所需的资源,而不是一次性提取所有内容,这有助于节省存储空间并专注于需要的部分。 3. **多种格式输出**:提取出来的资源可以保存为多种常见格式,如图像可以转换为JPEG、...
软件的使用十分方便,只需要指定待提取的文件和目标文件夹,Universal Extractor 会自动分析文件类型并提取完成。通过在资源管理器中使用鼠标右键操作,更是可以一键完成提取。事实上,Universal Extractor 的幕后...
PyInstaller Extractor v2.0 (Supports pyinstaller 5.3, 5.2, 5.1, 5.0.1, 5.0, 4.10, 4.9, 4.8, 4.7, 4.6, 4.5.1, 4.5, 4.4, 4.3, 4.2, 4.1, 4.0, 3.6, 3.5, 3.4, 3.3, 3.2, 3.1, 3.0, 2.1, 2.0) Author : Extreme...
《Extractor2.5:解锁资源提取的无限可能》 Extractor2.5,作为一个备受瞩目的资源提取工具,它以其强大的功能和高效的性能在IT行业内...如果你还在寻找一款强大的资源提取工具,Extractor2.5无疑是值得信赖的选择。
赠送jar包:metadata-extractor-2.6.2.jar; 赠送原API文档:metadata-extractor-2.6.2-javadoc.jar; 赠送源代码:metadata-extractor-2.6.2-sources.jar; 赠送Maven依赖信息文件:metadata-extractor-2.6.2.pom;...
下面,我们将深入探讨Q3D EXTRACTOR的主要功能、工作流程以及应用实例。 一、ANSOFT Q3D EXTRACTOR的核心功能 1. **参数提取**:Q3D EXTRACTOR能够从复杂的三维几何模型中提取电感、电容、电阻、互感等电气参数。...
提供的压缩包文件**Universal IFR Extractor_0.5.exe** 是该工具的可执行文件,用户只需下载并运行,即可开始IFR提取过程。值得注意的是,由于涉及到固件层面的操作,使用此类工具需要一定的技术背景和谨慎态度,...
`vdexExtractor`是一个开源工具,它提供了便捷的方式对vdex和odex文件进行解包、反编译和分析。主要功能包括: 1. **提取vdex文件**:能够从设备的/data分区或apk的obb扩展文件中提取vdex文件。 2. **反编译vdex**...
与PC3000工具相比,Flash_Extractor的出现提供了一种新的选择。PC3000是业内知名的数据恢复工具,尤其在硬盘恢复领域有很高的声誉,但其对U盘恢复的专门支持可能不如Flash_Extractor全面。Flash_Extractor的出现,...
总的来说,MTK Extractor v2.6.3是一个强大的工具,它为联发科设备用户提供了一种简便的方式来探索和管理他们的设备固件。通过深入了解和熟练使用这个工具,用户可以更有效地处理设备故障,自定义系统设置,甚至进行...