我有一个不使用Spring容器的小应用程序.现在需要这个应用程序访问数据库,只需几个小查询,没什么复杂的.虽然我可以用纯JDBC做到这一点,但我真的很想使用Spring-JDBC库.我担心的是,如果不将太多的Spring引入应用程序,它是否可以轻松使用."太多的春天"我的意思是必须创建弹簧容器,过多的外部库依赖等.请建议.
我正在尝试使用DB2JDBC Type4驱动程序配置DB2连接。但我收到此错误。
线程“主”中的异常com.ibm.db2.jcc.am.SqlInvalidAuthorizationSpecException:[jcc] [t4] [201] [11237] [3.64.104]发生了连接授权失败。原因:不支持安全机制。错误代码= -4214,SQLSTATE = 28000
我的代码是
public Connection getConnection() throws ClassNotFoundException, InstantiationException,
IllegalAccessException, SQLException{
Driver driver = (Driver) Class.forName ( "com.ibm.db2.jcc.DB2Driver" ).newInstance();
DriverManager.registerDriver(driver);
Connection connection = DriverManager.getConnection("jdbc:db2://hostname:portnumber
/DBName", "username","password" );
System.out.println( "From DAO, connection obtained " );
return connection;
}
Run Code Online (Sandbox Code Playgroud)
异常日志:
Exception in thread "main" com.ibm.db2.jcc.am.SqlInvalidAuthorizationSpecException:
[jcc][t4][201][11237][3.64.104] Connection authorization failure occurred.
Reason: Security mechanism not supported. ERRORCODE=-4214, SQLSTATE=28000
at com.ibm.db2.jcc.am.bd.a(bd.java:677)
at com.ibm.db2.jcc.am.bd.a(bd.java:60)
at com.ibm.db2.jcc.am.bd.a(bd.java:120)
at com.ibm.db2.jcc.t4.b.f(b.java:2389)
at com.ibm.db2.jcc.t4.b.a(b.java:1712)
at com.ibm.db2.jcc.t4.y.b(y.java:3612)
at com.ibm.db2.jcc.t4.y.a(y.java:477)
at com.ibm.db2.jcc.t4.y.a(y.java:117)
at …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Spring的JdbcTemplate类在名为MySQL的表中插入一行transaction并获取生成的ID.相关代码是:
public Transaction insertTransaction(final Transaction tran) {
// Will hold the ID of the row created by the insert
KeyHolder keyHolder = new GeneratedKeyHolder();
getJdbcTemplate().update(new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(INSERT_TRAN_SQL);
ps.setString(1, tran.getTransactionType().toString());
Date sqlDate = new Date(tran.getDate().getTime());
ps.setDate(2, sqlDate);
ps.setString(3, tran.getDescription());
return ps;
}
}, keyHolder);
tran.setId(keyHolder.getKey().longValue());
return tran;
}
Run Code Online (Sandbox Code Playgroud)
但是调用引发了以下异常 getJdbcTemplate().update
java.sql.SQLException:未请求生成的密钥.您需要将Statement.RETURN_GENERATED_KEYS指定为Statement.executeUpdate()或Connection.prepareStatement().
我可以插入行并获取生成的ID,而不会放弃JdbcTemplate吗?我使用的是Spring 2.5,MySQL 5.5.27和MySQL Connector 5.1.26.
我使用spring org.springframework.jdbc.core.JdbcTemplate和org.springframework.jdbc.core.simple.SimpleJdbcCall进行数据库查询.我正在使用log4j2.xml进行日志记录.我想将所有sql查询及其DB结果记录在db.log文件中.
我曾尝试在我的log4j2.xml文件中使用以下logger,但它没有在db.log文件中记录任何内容.我试过level ="TRACE"和level ="debug"但两个都没有用.
<RollingFile name="db" fileName="${sys:catalina.home}/logs/db.log"
filePattern="${sys:catalina.home}/logs/$${date:yyyy-MM-dd}/db-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout
pattern="%d{dd/MM/yyyy HH:mm:ss,SSS} [%X{cartID}] [%X{sessionId}] [%p] [%t] [%c] (%F:%L) - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="org.springframework.jdbc.core.JdbcTemplate" level="TRACE" additivity="false">
<Appender-Ref ref="db" />
</Logger>
Run Code Online (Sandbox Code Playgroud)
在我们的java类中,我们使用以下sql
String sQuery = "select count(*) from impersonation_requests where ir_eid = ? and ir_tmp_userid = ?";
String value = template
.queryForObject(sQuery, new Object[] { passwordInfo.getEid(),
passwordInfo.getUserId() }, String.class);
Run Code Online (Sandbox Code Playgroud)
var template是org.springframework.jdbc.core.JdbcTemplate的实例变量
我想在db.log文件中看到sQuery和value条目.我们可以使用JdbcTemplate实现这一点,或者我需要在所有DAO类中实现logger,并在我使用JdbcTemplate的每个类中记录sQuery和值.我想避免这种方法.请建议.
我的任务是使用BoneCP和jOOQ以及Spring建立一个项目,但是我遇到了一些困难.在我的MySQL数据库中单独插入可以很好地工作,但使用190,000个对象需要大约20分钟,所以为了加快速度,我想一次使用100个批量插入.但是,这会引发以下异常:
org.springframework.transaction.TransactionSystemException: Could not roll back JDBC transaction; nested exception is java.sql.SQLException: Connection is closed!
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback(DataSourceTransactionManager.java:288)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:849)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:826)
at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:496)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:266)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
at com.theshahin.service.YmsLinkDataService$$EnhancerBySpringCGLIB$$b9b6e447.create(<generated>)
at com.theshahin.integration.YmsLinkDataServiceTest.foo(YmsLinkDataServiceTest.java:76)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309) …Run Code Online (Sandbox Code Playgroud) 如何传递多个参数jdbcTemplate queryForInt以获取计数.我试过这个,
Integer count = this.jdbcTemplate
.queryForInt("select count(name) from table_name where parameter1 = ? and parameter2 = ?", new Object[]{parameter1,parameter2});
Run Code Online (Sandbox Code Playgroud)
但它表现queryForInt为罢工.
我JdbcInvoiceRepository在Spring Boot项目中执行了以下方法(下面的完整类):
public int[] bulkSaveInvoices(List<Invoice> invoices){
String insertSQL = "INSERT INTO invoices VALUES (:id, :exactIssueTime, :finalIssueTime, :issuer, :groupID)";
SqlParameterSource[] sqlParams = SqlParameterSourceUtils.createBatch(invoices.toArray());
int[] insertCounts = namedParameterJdbcTemplate.batchUpdate(insertSQL, sqlParams);
return insertCounts;
}
Run Code Online (Sandbox Code Playgroud)
我提供了转换器:
??? Invoice.java
??? InvoiceRepository.java
??? persistance
??? converters
? ??? LocalDateAttributeConverter.java
? ??? LocalDateTimeAttributeConverter.java
??? JdbcInvoiceRepository.java
Run Code Online (Sandbox Code Playgroud)
转换器LocalDateTime:
@Converter(autoApply = true)
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
@Override
public Timestamp convertToDatabaseColumn(LocalDateTime locDateTime) {
return (locDateTime == null ? null : Timestamp.valueOf(locDateTime));
}
@Override …Run Code Online (Sandbox Code Playgroud) 我不知道如何实现这一点。任何帮助和/或指针将不胜感激。
目前,我的Java / Spring应用程序后端已部署在EC2上,并使用常规的Spring JDBC设置成功访问了RDS上的MySQL。也就是说,存储数据库中的信息application.properties和配置DataSource,并JdbcTemplate在@Configuration类。一切正常。
现在,我需要安全地访问RDS上的MySQL 。RDS实例已启用IAM身份验证。我还成功创建了IAM角色并应用了内联策略。然后,按照此链接上的AWS RDS文档和Java示例,我能够使用身份验证令牌和我创建的用户(而不是常规的db用户名和密码)从独立的Java类成功访问数据库。这个独立的Java类直接处理“ Connection ”对象。
我遇到的困难是如何将其转换为Spring JDBC配置。也就是说,在我的@Configuration类中为此设置DataSource和JdbcTemplatebean。
实施此方法的正确/正确方法是什么?
-----编辑-开始-----
我正在尝试将其实现为可用于多个项目的库。也就是说,它将用作JAR,并在项目的POM文件中声明为依赖项。该库将包括可配置的AWS服务,例如使用常规DB用户名和密码的RDS访问,使用IAM身份验证的RDS访问,用于数据加密的KMS(CMK /数据密钥)等。
想法是根据项目在任何Web /应用服务器上使用此库。
希望这可以澄清我的需求。
-----编辑-结束-----
DataSource内部具有getConnection(),因此我基本上可以创建自己的DataSource实现来实现所需的功能。但这是一个好方法吗?
就像是:
public class MyDataSource implements DataSource {
@Override
public Connection getConnection() throws SQLException {
Connection conn = null;
// get a connection using IAM Authentication Token for …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring @EnableAsync和@Async注释构建一个多线程的Spring Boot应用程序.当我使用单个线程(CorePoolSize 1,MaxPoolSize 1)运行应用程序时,一切都按预期工作.当我将池大小增加到1以上似乎是随机出现时,我得到java.sql.SQLNonTransientException:[Amazon] JDBC并非所有参数都已填充.调用Amazon AWS Redshift数据库时出错.
在ServiceProcessBean.java中,我自动连接了我的ProcessService类(要完成的线程工作)和ShipmentDAO,它加载了一个由ProcessService.process()方法处理的装运ID列表,代码如下.
@Component
public class ShipmentBatchBean {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private ShipmentDAO shipmentDAO;
@Autowired
private ProcessService processService;
@Scheduled(
initialDelayString = "${executor.delay.initial}",
fixedDelayString = "${executor.delay.fixed}"
)
public void cronJob() throws InterruptedException, ExecutionException {
List<CompletableFuture<Boolean>> asyncResponse = new ArrayList<>();
logger.info("Starting cronJob() method");
try {
List<String> shipments = shipmentDAO.getAllShipmentsReadyForIeta();
logger.info("There are {} shipments to be processed in the data store",
shipments.size());
for(String shipment : shipments) {
asyncResponse.add(processService.process(shipment));
}
} catch (Exception …Run Code Online (Sandbox Code Playgroud) spring-jdbc ×10
java ×6
spring ×4
jdbctemplate ×3
spring-boot ×2
amazon-rds ×1
architecture ×1
aws-iam ×1
bonecp ×1
database ×1
db2 ×1
java-ee ×1
jdbc ×1
jndi ×1
jooq ×1
log4j2 ×1
logging ×1
mysql ×1
spring-async ×1
spring-mvc ×1