标签: spring-jdbc

在Spring JDBC中通过JNDI获取JDBC连接

关于Spring JDBC的这个页面

DataSourceUtils类...提供静态方法以从JNDI获取连接

但是,据我所知,DataSourceUtils的API文档不包括上述静态方法.

我错过了什么?

spring jndi jdbc spring-jdbc

6
推荐指数
2
解决办法
2万
查看次数

Spring-JDBC作为独立库

我有一个不使用Spring容器的小应用程序.现在需要这个应用程序访问数据库,只需几个小查询,没什么复杂的.虽然我可以用纯JDBC做到这一点,但我真的很想使用Spring-JDBC库.我担心的是,如果不将太多的Spring引入应用程序,它是否可以轻松使用."太多的春天"我的意思是必须创建弹簧容器,过多的外部库依赖等.请建议.

java spring-jdbc

6
推荐指数
1
解决办法
2095
查看次数

发生DB2连接授权失败原因:Java不支持安全性机制

我正在尝试使用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)

java database db2 spring-jdbc java-ee

6
推荐指数
1
解决办法
5万
查看次数

插入行并获取生成的ID

我正在尝试使用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.

java spring-jdbc jdbctemplate

6
推荐指数
2
解决办法
2万
查看次数

如何使用log4j2在日志文件中记录spring JdbcTemplate sql查询和数据库响应

我使用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和值.我想避免这种方法.请建议.

logging spring spring-mvc spring-jdbc log4j2

6
推荐指数
2
解决办法
2万
查看次数

BoneCP抛出"SQLException:连接已关闭!" 批量插入MySQL时

我的任务是使用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)

mysql spring spring-jdbc bonecp jooq

6
推荐指数
1
解决办法
2011
查看次数

jdbctemplate count queryForInt并传递多个参数

如何传递多个参数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为罢工.

java spring-jdbc jdbctemplate

6
推荐指数
2
解决办法
2万
查看次数

Spring Boot:无法推断用于java.time.LocalDateTime实例的SQL类型

JdbcInvoiceRepositorySpring 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)

spring spring-jdbc jdbctemplate spring-boot

6
推荐指数
1
解决办法
5516
查看次数

使用IAM身份验证和Spring JDBC(DataSource和JdbcTemplace)访问AWS RDS

我不知道如何实现这一点。任何帮助和/或指针将不胜感激。

目前,我的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类中为此设置DataSourceJdbcTemplatebean。

实施此方法的正确/正确方法是什么?

-----编辑-开始-----

我正在尝试将其实现为可用于多个项目的库。也就是说,它将用作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)

java architecture spring-jdbc amazon-rds aws-iam

6
推荐指数
2
解决办法
2447
查看次数

java.sql.SQLNonTransientException:[Amazon] [JDBC](10900)并非所有参数都已填充

我正在使用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)

java spring-jdbc amazon-redshift spring-boot spring-async

6
推荐指数
1
解决办法
1620
查看次数