spring-projects / spring-data-relational Goto Github PK
View Code? Open in Web Editor NEWSpring Data Relational. Home of Spring Data JDBC and Spring Data R2DBC.
Home Page: https://spring.io/projects/spring-data-jdbc
License: Apache License 2.0
Spring Data Relational. Home of Spring Data JDBC and Spring Data R2DBC.
Home Page: https://spring.io/projects/spring-data-jdbc
License: Apache License 2.0
Thomas Risberg opened DATAJDBC-36 and commented
Switch to using Gradle for builds
Affects: Ext 1.0 RC3
Lukasz Rzeszotarski opened DATAJDBC-42 and commented
Current implementation of
org.springframework.data.jdbc.jms.listener.oracle.AdtMessageListenerContainer
doesn't support durableSubscribers. Even if you try define so in spring context definition by using
<jms:listener-container connection-factory="connectionFactory"
client-id="LUKAS"
cache="test"
container-class="org.springframework.data.jdbc.jms.listener.oracle.AdtMessageListenerContainer"
destination-type="durableTopic">
<jms:listener destination="TEST_QUEUE"
ref="messageDelegate" method="handleMessage" subscription="LUKAS" />
</jms:listener-container>
I think in AdtMessageListenerContainer#createConsumer should be sth like:
if (durable) {
return ((AQjmsSession) session).createDurableSubscriber(topic, consumerName, null, false, new OraDataFactory());
} else {
return ((AQjmsSession) session).createConsumer(destination, null, new OraDataFactory(), null, false);
}
Another problem is that without extending AdtMessageListenerContainer you cannot through <jms:listener-container /> definition define consumer name. Because "client-id" and "subscription" parameters are not mapped to consumer name which is what I see randomly generated by oracle aqapi. In some case it would be nice to have possiblity to set up name of the durable consumer when you are using ADT payloads.
Affects: Ext 1.0 RELEASE
cemo koc opened DATAJDBC-82 and commented
Almost all modules of spring evolved in last a few years in terms of simplicity and conciseness. We are against using heavy libraries such as JPA or other persistence API implementations. Spring JDBC module is simple and low level. However spring-jdbc module has not changed so much. It is working great but it can be considered a little bid old-fashioned. You have to duplicated a fair amount code to just query a table. I am not opening this issue in Spring Data project because I think that this must be part of Spring Framework.
What we would like to see is an annotation based approach. There is a project which is very similar to what I have in my mind. JDBI 1 has annotation based API and it is very convenient to use it.
public interface MyDAO
{
@SqlUpdate("create table something (id int primary key, name varchar(100))")
void createSomethingTable();
@SqlUpdate("insert into something (id, name) values (:id, :name)")
void insert(@Bind("id") int id, @Bind("name") String name);
@SqlQuery("select name from something where id = :id")
String findNameById(@Bind("id") int id);
}
This piece of code can be more elegant even with ParameterResolvers. I will try to summarize the ideas in my mind which can greatly improve this module.
I can count other goodness of JDBI project. After having an annotation approach in Spring JDBC module, Oliver or someone else can add a module to Spring Data project which is based on Spring JDBC module but working with annotations such as Persistence API Annotations. Also Spring Roo project's auto finder can be part of this project as well.
I predict that the improvement I suggested above on JDBC module can create same effect of Spring MVC Annotation based Controller effect.
Hope that It will be part of Spring JDBC module.
Issue Links:
4 votes, 11 watchers
Cemo Koc opened DATAJDBC-24 and commented
Spring Data JPA is simply amazing. What I would like to see is utilizing JPA Annotations and Spring Data JPA project to use JDBCTemplate. I am not sure this is the correct place to file this issue but its usage and the way to create necessary implementation fits perfectly for JDBCTemplate. Any idea about it?
Issue Links:
François Wagner opened DATAJDBC-52 and commented
Good morning,
I created a JMS Queue in my Oracle Database and a trigger on a table which call a procedure to enqueue messages.
When I insert/update/delete one row and then commit, my java app receive correctly the message, but when I commit multiple updates, my java app receive only the first message. But I can see on the Queue Table that my multiples messages had been inserted...
Can you tell me if you find an issue on my context file ?
Thanks in advance!
Regards,
François
Affects: Ext 1.0 RELEASE
Reference URL: spring-attic/spring-data-jdbc-ext#3
Attachments:
Jan Philipp opened DATAJDBC-45 and commented
After I'd found Spring Data JDBC/Oracle by surprise, I want give it a try.
I've tried following
<orcl:pooling-datasource id="dataSource" properties-location="file:${user.home}aFileInMyHomeDir.properties" />
Just like other setups (i.e. MessageSource), but this one will not work. Stepping into it resolves that ResourceLoader.getResource() will be invoked with file:${user.home}aFileInMyHomeDir.properties (not replaced) and cannot itself resolve the property.
I would say this is a bug or a missing resolving.. or did I have missed something? How can I provide database properties without a) my classpath and b) without specifying an absolute path which isn't possible when supporting multiple platforms (win/*nix).
A fallback could be defining separated connection and cache properties, however, referenced properties beans are not allowed for connection-properties and connection-cache-properties
Affects: Ext 1.0 RELEASE
Referenced from: commits spring-attic/spring-data-jdbc-ext@1966c38
Serkan ÖZAL opened DATAJDBC-46 and commented
There is already a rowmapper named "org.springframework.jdbc.core.BeanPropertyRowMapper" for binding resultset attributes to object. But it is reflection based and can cause performance problems as Spring developers said. A byte code generation (with CGLib and Javassist) based rowmapper maybe a helpful feature. It generates rowmapper on the fly like implementing as manual so it has no performance overhead. It can also supports object relations as lazy and eager.
No further details from DATAJDBC-46
Koen Serneels opened DATAJDBC-9 and commented
=> Spring + Spring Data + Oracle AQ + DataSourceTransactionmanager (no XA)
The included sample uses a DefaultMessageListenerContainer to receive a message from an Oracle AQ.
Inside the message listener a second transaction is started, in that transaction (tx2) a new message is published (to a different queue) and a record is written to database.
Before the message listener ends, it also writes a record to database.
The latter happens in tx1, the tx started by the DefaultMessageListenerContainer when receiving the message.
Everything goes OK, there are no exceptions. However, the end result in the database is that there is only one record inserted instead of two.
It is the second record (from the DefaultMessageListenerContainer tx) that is inserted. The record from tx2 is gone, as it never happened.
The message produced by TX2 did endup on the queue (which makes it even weirder).
After some searching I saw a ROLLBACK being issued on the underlying JDBC connection.
This happens in the AQjmsSession, preClose method.
When the JMS Session (which is an AQjmsSession) is closed, the preclose is also called.
The preclose does a rollback when "!isInGlobalTransactionRechecked()" and "!isExternal()" test returns true:
The isInGlobalTransactionRechecked is only true when it detects an WEBLOGIC transaction manager obtained via JNDI (so this will never ever return true when running from a plain SE env).
There is a JVM property: oracle.jms.useEmulatedXA, but that is TRUE by default (System.err.println(AQjmsConstants.useEmulatedXA())).
In this case a EmulatedXAHandler is used, and its that handler that does the JNDI check for a WL TX manager (if not, it returns false).
The sExternal() can apparantly only be true if you let the AQ infrastructure use a sql.connection instead of a datasource.
There are no such statics on AQjmsFactory. So maybe it might work if you obtain the JMS ConnectionFactory by pass it a username/password/url ...
It appears that this rollback is called all the time when a AQjmsSession closes.
However, normally a commit is done PRIOR the rollback, so the rollback does actually nothing (I have no idea why they do that, but anyway).
So first I confirmed my case by installing a custom AqJmsFactoryBeanFactory in the app context (instead of using the ns config).
In that custom AqJmsFactoryBeanFactory I changed the CloseSuppressingInvocationHandler, in its proxy invoke method I added:
if (method.getName().equals("rollback")) {
return null;
}
By swallowing the rollback the problem is solved: after that the second record also appeared in the database.
This did not explain why the outer transaction did commit
So I ran it a second time, but I just printed out when a call was made to commit or rollback.
It then looked like this:
Processing message...
start new transaction
This explains why the record was never there, as rollback is issues on the end of transaction tx2
Then I did a third test and removed the new tx runner, so that everything runs in the SAME transaction (TX1).
The log then looks likes this:
Processing message...
start new transaction
message sended
insert done
ending new transaction
insert done
So in that case the two records where there (without the need of swallowing a commit or rollback).
When using a new transaction, a commit is triggered right after sending the message.
My guess is that this makes a second commit on transaction end (from the tx manager) no longer necesary as the connection is already commited.
The rollback is however always executed when the session is closed (by AQ, not by spring) and that one rolls back my insert.
In case of a single tx, there is no commit called after the message has been sent.
So the commit is called on tx end, and everything gets inserted.
A rollback is then issues as usual on session close, but that does not roll anything back.
I checked why the commit is done in the case of tx2. In AQjmsProducer the method jdbcEnqueue is called when a message is send.
In that method it does a 'forceCommit' when 'isInGlobalTransactionRechecked()' is false OR its session is NOT transacted.
As we learned already, 'isInGlobalTransactionRechecked' returns false.
The transacted comes from the flag if a JMS session should be transacted yes or no.
The Spring JmsTemplate created a NON transacted session in my tx2, thats why the flag is false and a commit is forced.
In the transaction started by the DefaultMessageListenerContainer, the 'transacted' will probably be true.
We might get a step further if we suppress commits and closes on the connection (and run in transacted session when not using XA).
The question is, are still other unforeseen things like this waiting?
Affects: Ext 1.0 M1
Attachments:
Torsten Keim opened DATAJDBC-39 and commented
We would like to execute an insert via JPA and an enqueue to an Oracle AQ in one local shared oracle transaction.
As explained in "4.3. Configuring the Connection Factory to use the same local transaction as your data access code." our spring configuration looks like:
<orcl:aq-jms-connection-factory id="connectionFactory" use-local-data-source-transaction="true" connection-factory-type="QUEUE_CONNECTION" data-source="dataSource" />
We use JmsTemplate for enqueueing and we set its member sessionTransacted to true, because the javadoc says:
'Setting this flag to "true" will use a short local JMS transaction when running outside of a managed transaction, and a synchronized local JMS transaction in case of a managed transaction (other than an XA transaction) being present. The latter has the effect of a local JMS transaction being managed alongside the main transaction (which might be a native JDBC transaction), with the JMS transaction committing right after the main transaction.'
We set a breakpoint in
JpaTransactionManager.doCommit(DefaultTransactionStatus) line: 512
and could see that this statement indeed causes the Oracle transaction to be committed, i.e. the inserted row and the queue entry could both be seen from an external sqlplus session. So the sharing of the same Oracle transaction works.
But then we come to another breakpoint at:
AQjmsSession.commit() line: 1009
JmsResourceHolder.commitAll() line: 181
ConnectionFactoryUtils$JmsResourceSynchronization.processResourceAfterCommit(JmsResourceHolder) line: 404
ConnectionFactoryUtils$JmsResourceSynchronization.processResourceAfterCommit(ResourceHolder) line: 1
ConnectionFactoryUtils$JmsResourceSynchronization(ResourceHolderSynchronization<H,K>).afterCommit() line: 79
TransactionSynchronizationUtils.invokeAfterCommit(List<TransactionSynchronization>) line: 133
TransactionSynchronizationUtils.triggerAfterCommit() line: 121
JpaTransactionManager(AbstractPlatformTransactionManager).triggerAfterCommit(DefaultTransactionStatus) line: 950
JpaTransactionManager(AbstractPlatformTransactionManager).processCommit(DefaultTransactionStatus) line: 796
JpaTransactionManager(AbstractPlatformTransactionManager).commit(TransactionStatus) line: 723
and this will throw the following exception:
org.springframework.jms.connection.SynchedLocalTransactionFailedException: Local JMS transaction failed to commit; nested exception is javax.jms.IllegalStateException: JMS-131: Session ist geschlossen
at org.springframework.jms.connection.ConnectionFactoryUtils$JmsResourceSynchronization.processResourceAfterCommit(ConnectionFactoryUtils.java:407)
at org.springframework.jms.connection.ConnectionFactoryUtils$JmsResourceSynchronization.processResourceAfterCommit(ConnectionFactoryUtils.java:1)
at org.springframework.transaction.support.ResourceHolderSynchronization.afterCommit(ResourceHolderSynchronization.java:79)
at org.springframework.transaction.support.TransactionSynchronizationUtils.invokeAfterCommit(TransactionSynchronizationUtils.java:133)
at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerAfterCommit(TransactionSynchronizationUtils.java:121)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerAfterCommit(AbstractPlatformTransactionManager.java:950)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:796)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:147)
....
Caused by: javax.jms.IllegalStateException: JMS-131: Session ist geschlossen
at oracle.jms.AQjmsError.throwIllegalStateEx(AQjmsError.java:471)
at oracle.jms.AQjmsSession.checkSessionStarted(AQjmsSession.java:4736)
at oracle.jms.AQjmsSession.commit(AQjmsSession.java:1009)
at org.springframework.jms.connection.JmsResourceHolder.commitAll(JmsResourceHolder.java:181)
at org.springframework.jms.connection.ConnectionFactoryUtils$JmsResourceSynchronization.processResourceAfterCommit(ConnectionFactoryUtils.java:404)
... 58 more
So the problem is that the JmsTemplate is not aware of the fact that the Oracle transaction is shared by JPA and JMS and tries to commit an already committed transaction.
Affects: Ext 1.0 RC4
Catwalker Liu opened DATAJDBC-7 and commented
SqlCall line 132-152 composing sql call string. The number of input parameters represented by "?" is calculated wrong if backend is function (vs. procedure) and SqlReturnResultSet is used.
MyStoredProcedure extends StoredProcedure ...
super(...)
declareParameter(new SqlReturnResultSet("rs", new MyMapper()));
declareParameter(new SqlParameter("FIRST_NM", Types.VARCHAR));
No further details from DATAJDBC-7
Nil Adiguzel opened DATAJDBC-5 and commented
Please give Nil access to Oracle. She is a Research Assistant in LRN starting today.
Thanks,
No further details from DATAJDBC-5
Oliver Drotbohm opened DATAJDBC-21 and commented
We could provide Spring Data repositories support for the JDBC module based on the QuerydslJdbcTemplate
Issue Links:
leebm opened DATAJDBC-56 and commented
this is my code:
String sql = "insert into tab(id,data) values(?,?)";
jdbcTemplate.update(sql, new AbstractLobCreatingPreparedStatementCallback(lobHandler) {
@Override
protected void setValues(PreparedStatement pst, LobCreator lobCreator)
throws SQLException, DataAccessException {
pst.setString(1, "1");
lobCreator.setClobAsString(pst, 2, "test");
}
});
No further details from DATAJDBC-56
ryo murai opened DATAJDBC-34 and commented
QueryDslJdbcOperations#queryForObject(SQLQuery, ExpressionBase<T>)
breaks a spec described its javadoc: The results are mapped using the {@link
ExpressionBase} which could be a QBean or a MappingProjection.
Because QBean(extends RelationalPathBase) is not an ExpressionBase but Expression, I can't pass a QBean object as ExpressionBase. The compilation fails at below line.
template.queryForObject(sqlQuery, QBeanObj)
Affects: Ext 1.0 M2
Referenced from: commits spring-attic/spring-data-jdbc-ext@3225617
1 votes, 2 watchers
Thomas Risberg opened DATAJDBC-6 and commented
Add some basic support for integrating QueryDSL SQL queries with Spring's JdbcTemplate
Referenced from: commits spring-attic/spring-data-jdbc-ext@e8e1455, spring-attic/spring-data-jdbc-ext@36e83ce, spring-attic/spring-data-jdbc-ext@b786038, spring-attic/spring-data-jdbc-ext@365438f, spring-attic/spring-data-jdbc-ext@3310124, spring-attic/spring-data-jdbc-ext@f8d3cd9, spring-attic/spring-data-jdbc-ext@07f042d, spring-attic/spring-data-jdbc-ext@0ca0c04, spring-attic/spring-data-jdbc-ext@b18c3a9, spring-attic/spring-data-jdbc-ext@9f75a54
Stefan Reuter opened DATAJDBC-18 and commented
spring-data-oracle makes use of reflection und thus needs some explicit Import-Package entries in its manifest that are not automatically added by bundlor.
When using AQ in an OSGi environment you get the following errors:
[2011-10-06 10:23:03.706] MessageListenerContainer#0-1 o.s.data.jdbc.config.oracle.AqJmsFactoryBeanFactory Using Proxied JDBC Connection [oracle.jdbc.driver
.LogicalConnection@4381c7e9]
[2011-10-06 10:23:04.136] MessageListenerContainer#0-1 org.springframework.jms.listener.DefaultMessageListenerContainer Initiating transaction rollback on listener exception java.lang.NoClassDefFoundError: oracle.jdbc.oracore.OracleTypeADT in KernelBundleClassLoader: [bundle=org.springframework.data.jdbc.oracle_1.0.0.EP01]
at $Proxy270.<clinit>(Unknown Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:588)
at org.springframework.data.jdbc.config.oracle.AqJmsFactoryBeanFactory.getCloseSuppressingConnectionProxy(AqJmsFactoryBeanFactory.java:172)
at org.springframework.data.jdbc.config.oracle.AqJmsFactoryBeanFactory$TransactionAwareDataSource.getConnection(AqJmsFactoryBeanFactory.java:145)
at oracle.jms.AQjmsDBConnMgr.getConnection(AQjmsDBConnMgr.java:566)
at oracle.jms.AQjmsDBConnMgr.<init>(AQjmsDBConnMgr.java:399)
at oracle.jms.AQjmsConnection.<init>(AQjmsConnection.java:249)
at oracle.jms.AQjmsConnectionFactory.createConnection(AQjmsConnectionFactory.java:513)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:58)
at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:62)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.osgi.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:59)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy193.createConnection(Unknown Source)
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:184)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.access$0(AbstractPollingMessageListenerContainer.java:1)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer$MessageListenerContainerResourceFactory.createConnection(AbstractPollingMessageListenerContainer.java:525)
at org.springframework.jms.connection.ConnectionFactoryUtils.doGetTransactionalSession(ConnectionFactoryUtils.java:297)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:288)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:243)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1058)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1050)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947)
at java.lang.Thread.run(Thread.java:662)
[2011-10-06 10:31:17.874] MessageListenerContainer#0-1 org.springframework.jms.listener.DefaultMessageListenerContainer Initiating transaction rollback on listener excep
tion java.lang.NoClassDefFoundError: oracle.jdbc.aq.AQDequeueOptions in KernelBundleClassLoader: [bundle=org.springframework.data.jdbc.oracle_1.0.0.EP01]
[2011-10-06 10:38:40.303] MessageListenerContainer#0-1 org.springframework.jms.listener.DefaultMessageListenerContainer Initiating transaction rollback on listener excep
tion java.lang.NoClassDefFoundError: oracle.jdbc.dcn.DatabaseChangeRegistration in KernelBundleClassLoader: [bundle=org.springframework.data.jdbc.oracle_1.0.0.EP01]
This can be fixed by explicitly importing the packages in template.mf
:
Import-Package:
sun.reflect;version="0";resolution:=optional,
oracle.jdbc.oracore;version="[10.2.0, 12.0.0)",
oracle.jdbc.aq;version="[10.2.0, 12.0.0)",
oracle.jdbc.dcn;version="[10.2.0, 12.0.0)"
Affects: Ext 1.0 M2
Andrei Tuzhilin opened DATAJDBC-26 and commented
Consider adding XA-enabled orcl:aq-jms-connection-factory. It would be nice to have use-local-data-source-transaction option to use one XA Connection for JMS and JDBC operations also (not sure if it's possible)
No further details from DATAJDBC-26
Dave Syer opened DATAJDBC-29 and commented
It would be good to see some pagination abstractions (similar to those used in Spring Batch) because of the variations in SQL dialects for pagination. Maybe QDSL can do this already? Or maybe it makes sense to have a native implementation anyway (given that Spring Batch already works pretty well and has a lot of bugfixes already in place).
My preference would be to have a kind of "active" list (embed a JdbcTemplate in it or something), so clients can use the java.util.List API but not download the whole universe
Issue Links:
DATAJDBC-309 Add infrastructure for semantic SQL generation
DATAJDBC-101 Support for PagingRepositories
3 votes, 4 watchers
Esen Sagynov opened DATAJDBC-10 and commented
Our company has been using the CUBRID RDBMS (http://www.cubrid.org) along with Spring for most of its 100+ services. So we want to share the patch for Spring which enables to use CUBRID as a back-end database through its JDBC driver (http://www.cubrid.org/cubrid_java_programming).
In the attachment you can find two files:
The files are released under BSD.
I think everything is ready. If otherwise, please let me know
Reference URL: http://forum.springsource.org/showthread.php?110504-CUBRID-Database-Support-through-its-JDBC-Driver&p=366361#post366361
Attachments:
Anthony Cunningham opened DATAJDBC-43 and commented
Chapter 5 introduction contains the sentence:
"XML data stored in the database is accessible wia JDBC using some Oracle specific classes."
This should read "...accessible via JDBC..."
Affects: Ext 1.0 RELEASE
Reference URL: http://static.springsource.org/spring-data/data-jdbc/docs/1.0.0.RC1/reference/html/#orcl.xmltypes
Referenced from: commits spring-attic/spring-data-jdbc-ext@71b8809
Andrei Tuzhilin opened DATAJDBC-23 and commented
I propose creating createStatement proxy for OracleConnection in aq-jms-connection-factory container.
This option is very useful for Oracle Advanced Queuing functionality within Spring transactions.
Aq internal calls does not use TransactionAware connection proxy, transaction timeout option cannot be applied inside AQ calls
Affects: Ext 1.0 RC1
Shrinivaasan opened DATAJDBC-3 and commented
JdbcTemplate is not supporting all the DataBases. An exception is thrown, while accessing Timestamp value from SQLite Db using JdbcTemplate. Since the java.sql.Timestamp values are stored as String/long values in SQLite data base, using the getTimestap() method fails throwing the below exception.
org.springframework.jdbc.InvalidResultSetAccessExc eption: getTime failed on value ( {0} ) in column {1} no conversion available12901443977182; nested exception is java.sql.SQLException: getTime failed on value ( {0} ) in column {1} no conversion available12901443977182
at org.springframework.jdbc.support.rowset.ResultSetW rappingSqlRowSet.getTimestamp(ResultSetWrappingSql RowSet.java:518)
at TestSqliteUsingSpring.getData(TestSqliteUsingSprin g.java:44)
at TestSqliteUsingSpring.main(TestSqliteUsingSpring.j ava:19)
Caused by: java.sql.SQLException: getTime failed on value ( {0} ) in column {1} no conversion available12901443977182
at com.sun.rowset.CachedRowSetImpl.getTimestamp(Unkno wn Source)
at com.sun.rowset.CachedRowSetImpl.getTimestamp(Unkno wn Source)
at org.springframework.jdbc.support.rowset.ResultSetW rappingSqlRowSet.getTimestamp(ResultSetWrappingSql RowSet.java:515)
Attachments:
Brett Ryan opened DATAJDBC-50 and commented
JdbcTemplate
is designed to simplify performing JDBC queries however there is not very good support for returning a value where a row may not exist when using any of the queryForObject
overloads, this means for simple types the author must be more verbose by either catching an IncorrectResultSizeDataAccessException
or using a query
overload and manually extract the value with a ResultSetExtractor<T>
extracting the first entry from a RowMapper<T>
, this results in more verbose code as can be seen here:
// Using a ResultSetExtractor
String name1 = jt.query("select name from customers where id = ?", new ResultSetExtractor<String>() {
@Override
public String extractData(ResultSet rs) throws SQLException, DataAccessException {
return rs.next() ? rs.getString("name") : null;
}
}, 123);
// Using a RowMapper
List<String> names = jt.query("select name from customers where id = ?", new RowMapper<String>() {
@Override
public String mapRow(ResultSet rs, int i) throws SQLException {
return rs.next() ? rs.getString("name") : null;
}
}, 123);
String name2 = names.isEmpty() ? null : names.get(0);
I propose to instead add an overload to the queryForObject
method that allows the author to expect zero or one values.
String name3 = jt.queryForObject("select name from customers where id = ?", true, String.class, 123);
Alternatively new methods could be created with the same functionality called queryForObjectOrNull
1 votes, 1 watchers
Oliver Drotbohm opened DATAJDBC-25 and commented
The SQLInsertClause
handed into said method provides methods that throw SQLExceptions
(e.g. executeWithKeys()
). These shouldn't have to be handled by the implementor but the template rather
Affects: Ext 1.0 RC1
Referenced from: commits spring-attic/spring-data-jdbc-ext@1d12f2e
Stefan Reuter opened DATAJDBC-17 and commented
The MANIFEST.MF packages in the distribution jar files should include the OSGi headers so that they can be used in OSGi containers without modification
Affects: Ext 1.0 M2
Koen Serneels opened DATAJDBC-8 and commented
We are using the Oracle AQ support from spring-data to have both JMS and JDBC over the same datasource, with local transactions instead of XA.
The big picture of our setup is basicly what is described in the reference manual:
Everything is working, but after a couple of minutes we get indications that the JDBC connection pool was exhausted and everything got stuck. In the JDBC connection pool monitor, we could see that all connections where in use: so something was clearly leaking connections. Since we were using the glassfish internal JDBC pool, we tried replacing the glassfish JDBC pool with commons DBCP, directly connecting from Spring to the db, bypassing any glassfish pool service. This did not resolve the problem: we got the exact same issue: exhausted pool after some minutes.
Through further investigation we learned that it was not a normal leak, since the physical connections to the database remained steady. So even if the container/DBCP showed us that 54 connections (of for instance max 100) were in use, we only saw for instance 6 connections to the database at a given time (6 x DefaultMessageListenerContainer on empty queues, just 1 thread checking for msg'es). Even more interesting was that when the pool got exhausted, and everything got stuck, we (immediately after) saw NO more open connections to the database.
So, this told us that their was no 'physical' leak, as the connections were all managed/closed properly.
It seemed that the pool was never informed that a connection is closed, and so never marked the connection as 'released' (allthough the connection did physically close). This seemed weird, as the transaction manager was doing its work correctly: we saw connections being 'returned' to the pool at the end of the transaction.
After some more searching, we found out that it was only some of the DefaultMessageListenerContainers that were leaking (the other all returned the connections at TX commit). The difference was that the leaking containers were 'in error': its corresponding Queue was not defined within Oracle. It is in these error scenario's that following connection leaking scenario is triggered in DefaultMessageListenerContainer:
Now, here it becomes interesting. At L859 the javax.jms.Connection is obtained through the oracle AQjmsConnectionFactory.
The AQjmsConnectionFactory was created by AqJmsFactoryBeanFactory, passing in our configured DataSource, but wrapped in a AqJmsFactoryBeanFactory$TransactionAwareDataSource. So, in the end AQjmsConnectionFactory internally obtains a new javax.sql.Connection from AqJmsFactoryBeanFactory$TransactionAwareDataSource (delegating the the JDBC connection pool). However, at L146 of AqJmsFactoryBeanFactory$TransactionAwareDataSource you see this:
[code]
if (TransactionSynchronizationManager.isActualTransactionActive()) {
if (logger.isDebugEnabled()) {
logger.debug("Using Proxied JDBC Connection [" + conToUse + "]");
}
return getCloseSuppressingConnectionProxy(conToUse);
}
[/code]
The "if" is in this case NOT executed and the connection obtained thus NOT proxied, since there was NO transaction started in refreshConnectionUntilSuccessful (and there was also none active). So, when at L860 of refreshConnectionUntilSuccessful the close() is propagated, it is executed on the RAW oracle connection (T4CConnection.logOff()). Making the connection physically disconnect.
However, [incorrect - see comment]since it was not proxied,[/incorrect] there was no call to the pool indicating that the connection was released! This brings the pool in an artificial state thinking its connections are somewhere in use while they are not.
Our temporary fix will be to customize DefaultMessageListenerContainer by overriding refreshConnectionUntilSuccessful() to do nothing.
But I suspect a better/cleaner fix is possible. Can this be looked at?
Affects: Ext 1.0 M1
Referenced from: commits spring-attic/spring-data-jdbc-ext@1fc1c7a
1 votes, 2 watchers
Thomas Risberg opened DATAJDBC-12 and commented
Add support for new custom row-mapping projections in QueryDSL 2.2.0
https://bugs.launchpad.net/querydsl/+bug/809289
No further details from DATAJDBC-12
Thomas Risberg opened DATAJDBC-4 and commented
We need to provide a configuration option for what type of ConnectionFactory should be created:
This applies to orcl:aq-jms-connection-factory and the underlying AqJmsQueueFactoryBeanFactory
Referenced from: commits spring-attic/spring-data-jdbc-ext@7c0588b
2 votes, 2 watchers
Hendrik Heneke opened DATAJDBC-40 and commented
Support for the "useQuotes" property of the database specific implementations of SQLTemplates should be added to QueryDslJdbcTemplate. At the moment, the only way to get quoted identifiers in the generated SQL statements is to copy its code and modify the constructors
Affects: Ext 1.0 RELEASE
Referenced from: commits spring-attic/spring-data-jdbc-ext@edd52a0
watanabe opened DATAJDBC-16 and commented
SQLQuery with SQLQueryImpl goes correctly.
But SQLQuery with QueryDslJdbcTemplate returns NullPointerException.
see attachment file (eclipse project)
@Component
public class AppService {
@Resource
DataSource dataSource;
public void runWithOutTemplate() {
Connection connection = DataSourceUtils.getConnection(dataSource);
SQLQuery query = new SQLQueryImpl(connection, new PostgresTemplates());
QEmployee qEmployee = QEmployee.employee;
try {
Employee emp = query.from(qEmployee).where(qEmployee.id.eq(1))
.uniqueResult(qEmployee);
System.out.println("### RESULT: " + emp.getName());
} finally {
DataSourceUtils.releaseConnection(connection, dataSource);
}
}
public void runWithTemplate() {
QueryDslJdbcTemplate tmpl = new QueryDslJdbcTemplate(dataSource);
SQLQuery query = tmpl.newSqlQuery();
QEmployee qEmployee = QEmployee.employee;
Employee emp = query.from(qEmployee).where(qEmployee.id.eq(1))
.uniqueResult(qEmployee);
System.out.println("### RESULT: " + emp.getName());
}
}
2011-10-04 17:13:09,921 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7b6889: startup date [Tue Oct 04 17:13:09 JST 2011]; root of context hierarchy
2011-10-04 17:13:10,003 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] Loading XML bean definitions from class path resource [applicationContext.xml]
2011-10-04 17:13:10,031 DEBUG [org.springframework.beans.factory.xml.DefaultDocumentLoader] Using JAXP provider [com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl]
2011-10-04 17:13:10,174 DEBUG [org.springframework.beans.factory.xml.PluggableSchemaResolver] Loading schema mappings from [META-INF/spring.schemas]
2011-10-04 17:13:10,179 DEBUG [org.springframework.beans.factory.xml.PluggableSchemaResolver] Loaded schema mappings: {http://www.springframework.org/schema/util/spring-util.xsd=org/springframework/beans/factory/xml/spring-util-3.0.xsd, http://www.springframework.org/schema/task/spring-task.xsd=org/springframework/scheduling/config/spring-task-3.0.xsd, http://www.springframework.org/schema/aop/spring-aop-3.0.xsd=org/springframework/aop/config/spring-aop-3.0.xsd, http://www.springframework.org/schema/aop/spring-aop-2.0.xsd=org/springframework/aop/config/spring-aop-2.0.xsd, http://www.springframework.org/schema/tool/spring-tool-2.5.xsd=org/springframework/beans/factory/xml/spring-tool-2.5.xsd, http://www.springframework.org/schema/beans/spring-beans.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd, http://www.springframework.org/schema/jee/spring-jee-2.5.xsd=org/springframework/ejb/config/spring-jee-2.5.xsd, http://www.springframework.org/schema/aop/spring-aop.xsd=org/springframework/aop/config/spring-aop-3.0.xsd, http://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans-2.0.xsd, http://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd, http://www.springframework.org/schema/task/spring-task-3.0.xsd=org/springframework/scheduling/config/spring-task-3.0.xsd, http://www.springframework.org/schema/tx/spring-tx-2.5.xsd=org/springframework/transaction/config/spring-tx-2.5.xsd, http://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd, http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd=org/springframework/jdbc/config/spring-jdbc-3.0.xsd, http://www.springframework.org/schema/tool/spring-tool-3.0.xsd=org/springframework/beans/factory/xml/spring-tool-3.0.xsd, http://www.springframework.org/schema/tx/spring-tx.xsd=org/springframework/transaction/config/spring-tx-3.0.xsd, http://www.springframework.org/schema/tool/spring-tool-2.0.xsd=org/springframework/beans/factory/xml/spring-tool-2.0.xsd, http://www.springframework.org/schema/util/spring-util-2.5.xsd=org/springframework/beans/factory/xml/spring-util-2.5.xsd, http://www.springframework.org/schema/lang/spring-lang.xsd=org/springframework/scripting/config/spring-lang-3.0.xsd, http://www.springframework.org/schema/lang/spring-lang-2.5.xsd=org/springframework/scripting/config/spring-lang-2.5.xsd, http://www.springframework.org/schema/jee/spring-jee-3.0.xsd=org/springframework/ejb/config/spring-jee-3.0.xsd, http://www.springframework.org/schema/jee/spring-jee-2.0.xsd=org/springframework/ejb/config/spring-jee-2.0.xsd, http://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.0.xsd, http://www.springframework.org/schema/jee/spring-jee.xsd=org/springframework/ejb/config/spring-jee-3.0.xsd, http://www.springframework.org/schema/aop/spring-aop-2.5.xsd=org/springframework/aop/config/spring-aop-2.5.xsd, http://www.springframework.org/schema/data/repository/spring-repository.xsd=org/springframework/data/repository/config/spring-repository-1.0.xsd, http://www.springframework.org/schema/jdbc/spring-jdbc.xsd=org/springframework/jdbc/config/spring-jdbc-3.0.xsd, http://www.springframework.org/schema/data/repository/spring-repository-1.0.xsd=org/springframework/data/repository/config/spring-repository-1.0.xsd, http://www.springframework.org/schema/tx/spring-tx-2.0.xsd=org/springframework/transaction/config/spring-tx-2.0.xsd, http://www.springframework.org/schema/tx/spring-tx-3.0.xsd=org/springframework/transaction/config/spring-tx-3.0.xsd, http://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd, http://www.springframework.org/schema/tool/spring-tool.xsd=org/springframework/beans/factory/xml/spring-tool-3.0.xsd, http://www.springframework.org/schema/util/spring-util-3.0.xsd=org/springframework/beans/factory/xml/spring-util-3.0.xsd, http://www.springframework.org/schema/lang/spring-lang-3.0.xsd=org/springframework/scripting/config/spring-lang-3.0.xsd, http://www.springframework.org/schema/util/spring-util-2.0.xsd=org/springframework/beans/factory/xml/spring-util-2.0.xsd, http://www.springframework.org/schema/lang/spring-lang-2.0.xsd=org/springframework/scripting/config/spring-lang-2.0.xsd, http://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans-2.5.xsd}
2011-10-04 17:13:10,224 DEBUG [org.springframework.beans.factory.xml.PluggableSchemaResolver] Found XML schema http://www.springframework.org/schema/beans/spring-beans-2.5.xsd in classpath: org/springframework/beans/factory/xml/spring-beans-2.5.xsd
2011-10-04 17:13:10,298 DEBUG [org.springframework.beans.factory.xml.PluggableSchemaResolver] Found XML schema http://www.springframework.org/schema/context/spring-context-2.5.xsd in classpath: org/springframework/context/config/spring-context-2.5.xsd
2011-10-04 17:13:10,312 DEBUG [org.springframework.beans.factory.xml.PluggableSchemaResolver] Found XML schema http://www.springframework.org/schema/tool/spring-tool-2.5.xsd in classpath: org/springframework/beans/factory/xml/spring-tool-2.5.xsd
2011-10-04 17:13:10,321 DEBUG [org.springframework.beans.factory.xml.PluggableSchemaResolver] Found XML schema http://www.springframework.org/schema/tx/spring-tx-2.5.xsd in classpath: org/springframework/transaction/config/spring-tx-2.5.xsd
2011-10-04 17:13:10,354 DEBUG [org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader] Loading bean definitions
2011-10-04 17:13:10,372 DEBUG [org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver] Loaded NamespaceHandler mappings: {http://www.springframework.org/schema/p=org.springframework.beans.factory.xml.SimplePropertyNamespaceHandler, http://www.springframework.org/schema/util=org.springframework.beans.factory.xml.UtilNamespaceHandler, http://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler, http://www.springframework.org/schema/aop=org.springframework.aop.config.AopNamespaceHandler, http://www.springframework.org/schema/jdbc=org.springframework.jdbc.config.JdbcNamespaceHandler, http://www.springframework.org/schema/tx=org.springframework.transaction.config.TxNamespaceHandler, http://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler, http://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler, http://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler}
2011-10-04 17:13:10,438 INFO [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] JSR-330 'javax.inject.Named' annotation found and supported for component scanning
2011-10-04 17:13:10,438 DEBUG [org.springframework.core.io.support.PathMatchingResourcePatternResolver] Looking for matching resources in directory tree [C:\nopafit-workspace\querydslsample3\target\classes\net\example\querydslsample3]
2011-10-04 17:13:10,438 DEBUG [org.springframework.core.io.support.PathMatchingResourcePatternResolver] Searching directory [C:\nopafit-workspace\querydslsample3\target\classes\net\example\querydslsample3] for files matching pattern [C:/nopafit-workspace/querydslsample3/target/classes/net/example/querydslsample3//*.class]
2011-10-04 17:13:10,443 DEBUG [org.springframework.core.io.support.PathMatchingResourcePatternResolver] Searching directory [C:\nopafit-workspace\querydslsample3\target\classes\net\example\querydslsample3\metadata] for files matching pattern [C:/nopafit-workspace/querydslsample3/target/classes/net/example/querydslsample3//.class]
2011-10-04 17:13:10,447 DEBUG [org.springframework.core.io.support.PathMatchingResourcePatternResolver] Searching directory [C:\nopafit-workspace\querydslsample3\target\classes\net\example\querydslsample3\service] for files matching pattern [C:/nopafit-workspace/querydslsample3/target/classes/net/example/querydslsample3/**/.class]
2011-10-04 17:13:10,451 DEBUG [org.springframework.core.io.support.PathMatchingResourcePatternResolver] Resolved location pattern [classpath*:net/example/querydslsample3/**/*.class] to resources [file [C:\nopafit-workspace\querydslsample3\target\classes\net\example\querydslsample3\App.class], file [C:\nopafit-workspace\querydslsample3\target\classes\net\example\querydslsample3\metadata\Employee.class], file [C:\nopafit-workspace\querydslsample3\target\classes\net\example\querydslsample3\metadata\QEmployee.class], file [C:\nopafit-workspace\querydslsample3\target\classes\net\example\querydslsample3\service\AppService.class]]
2011-10-04 17:13:10,501 DEBUG [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] Identified candidate component class: file [C:\nopafit-workspace\querydslsample3\target\classes\net\example\querydslsample3\service\AppService.class]
2011-10-04 17:13:10,565 DEBUG [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] Loaded 11 bean definitions from location pattern [applicationContext.xml]
2011-10-04 17:13:10,565 DEBUG [org.springframework.context.support.ClassPathXmlApplicationContext] Bean factory for org.springframework.context.support.ClassPathXmlApplicationContext@7b6889: org.springframework.beans.factory.support.DefaultListableBeanFactory@1c6572b: defining beans [appService,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,dataSource,transactionManager]; root of factory hierarchy
2011-10-04 17:13:10,612 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
2011-10-04 17:13:10,612 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
2011-10-04 17:13:10,643 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Eagerly caching bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor' to allow for resolving potential circular references
2011-10-04 17:13:10,644 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Finished creating instance of bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
2011-10-04 17:13:10,724 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
2011-10-04 17:13:10,725 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
2011-10-04 17:13:10,726 INFO [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2011-10-04 17:13:10,726 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Eagerly caching bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor' to allow for resolving potential circular references
2011-10-04 17:13:10,726 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Finished creating instance of bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
2011-10-04 17:13:10,726 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating shared instance of singleton bean 'org.springframework.context.annotation.internalRequiredAnnotationProcessor'
2011-10-04 17:13:10,726 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'org.springframework.context.annotation.internalRequiredAnnotationProcessor'
2011-10-04 17:13:10,727 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Eagerly caching bean 'org.springframework.context.annotation.internalRequiredAnnotationProcessor' to allow for resolving potential circular references
2011-10-04 17:13:10,727 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Finished creating instance of bean 'org.springframework.context.annotation.internalRequiredAnnotationProcessor'
2011-10-04 17:13:10,727 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
2011-10-04 17:13:10,727 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
2011-10-04 17:13:10,735 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Eagerly caching bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor' to allow for resolving potential circular references
2011-10-04 17:13:10,735 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Finished creating instance of bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
2011-10-04 17:13:10,736 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating shared instance of singleton bean 'org.springframework.aop.config.internalAutoProxyCreator'
2011-10-04 17:13:10,736 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'org.springframework.aop.config.internalAutoProxyCreator'
2011-10-04 17:13:10,746 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Eagerly caching bean 'org.springframework.aop.config.internalAutoProxyCreator' to allow for resolving potential circular references
2011-10-04 17:13:10,775 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Finished creating instance of bean 'org.springframework.aop.config.internalAutoProxyCreator'
2011-10-04 17:13:10,782 DEBUG [org.springframework.context.support.ClassPathXmlApplicationContext] Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@17b0998]
2011-10-04 17:13:10,785 DEBUG [org.springframework.context.support.ClassPathXmlApplicationContext] Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@1e2befa]
2011-10-04 17:13:10,786 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1c6572b: defining beans [appService,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,dataSource,transactionManager]; root of factory hierarchy
2011-10-04 17:13:10,786 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating shared instance of singleton bean 'appService'
2011-10-04 17:13:10,786 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'appService'
2011-10-04 17:13:10,804 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] Found injected element on class [net.example.querydslsample3.service.AppService]: ResourceElement for javax.sql.DataSource net.example.querydslsample3.service.AppService.dataSource
2011-10-04 17:13:10,805 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Eagerly caching bean 'appService' to allow for resolving potential circular references
2011-10-04 17:13:10,808 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] Processing injected method of bean 'appService': ResourceElement for javax.sql.DataSource net.example.querydslsample3.service.AppService.dataSource
2011-10-04 17:13:10,809 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating shared instance of singleton bean 'dataSource'
2011-10-04 17:13:10,809 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'dataSource'
2011-10-04 17:13:10,858 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Eagerly caching bean 'dataSource' to allow for resolving potential circular references
2011-10-04 17:13:10,890 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating shared instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
2011-10-04 17:13:10,890 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'org.springframework.transaction.config.internalTransactionAdvisor'
2011-10-04 17:13:10,892 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Eagerly caching bean 'org.springframework.transaction.config.internalTransactionAdvisor' to allow for resolving potential circular references
2011-10-04 17:13:10,917 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating shared instance of singleton bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0'
2011-10-04 17:13:10,917 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0'
2011-10-04 17:13:10,921 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Eagerly caching bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0' to allow for resolving potential circular references
2011-10-04 17:13:10,928 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Finished creating instance of bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0'
2011-10-04 17:13:10,928 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Finished creating instance of bean 'org.springframework.transaction.config.internalTransactionAdvisor'
2011-10-04 17:13:10,935 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Finished creating instance of bean 'dataSource'
2011-10-04 17:13:10,935 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
2011-10-04 17:13:10,938 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Finished creating instance of bean 'appService'
2011-10-04 17:13:10,938 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
2011-10-04 17:13:10,938 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
2011-10-04 17:13:10,938 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'org.springframework.context.annotation.internalRequiredAnnotationProcessor'
2011-10-04 17:13:10,938 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
2011-10-04 17:13:10,938 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'org.springframework.aop.config.internalAutoProxyCreator'
2011-10-04 17:13:10,938 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0'
2011-10-04 17:13:10,938 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating shared instance of singleton bean 'org.springframework.transaction.interceptor.TransactionInterceptor#0'
2011-10-04 17:13:10,938 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'org.springframework.transaction.interceptor.TransactionInterceptor#0'
2011-10-04 17:13:10,942 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Eagerly caching bean 'org.springframework.transaction.interceptor.TransactionInterceptor#0' to allow for resolving potential circular references
2011-10-04 17:13:10,947 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0'
2011-10-04 17:13:10,948 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Invoking afterPropertiesSet() on bean with name 'org.springframework.transaction.interceptor.TransactionInterceptor#0'
2011-10-04 17:13:10,948 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Finished creating instance of bean 'org.springframework.transaction.interceptor.TransactionInterceptor#0'
2011-10-04 17:13:10,948 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
2011-10-04 17:13:10,948 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'dataSource'
2011-10-04 17:13:10,948 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating shared instance of singleton bean 'transactionManager'
2011-10-04 17:13:10,948 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'transactionManager'
2011-10-04 17:13:10,962 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Eagerly caching bean 'transactionManager' to allow for resolving potential circular references
2011-10-04 17:13:10,976 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'dataSource'
2011-10-04 17:13:10,977 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Invoking afterPropertiesSet() on bean with name 'transactionManager'
2011-10-04 17:13:10,977 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
2011-10-04 17:13:10,980 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Finished creating instance of bean 'transactionManager'
2011-10-04 17:13:10,982 DEBUG [org.springframework.context.support.ClassPathXmlApplicationContext] Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@d6b059]
2011-10-04 17:13:10,982 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'lifecycleProcessor'
2011-10-04 17:13:10,983 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'appService'
2011-10-04 17:13:10,991 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Fetching JDBC Connection from DataSource
2011-10-04 17:13:11,339 DEBUG [com.mysema.query.sql.AbstractSQLQuery] query : select employee.id, employee.name
from employee employee
where employee.id = ?
limit ?
Affects: Ext 1.0 M2
Attachments:
Thomas Risberg opened DATAJDBC-55 and commented
See comment here: spring-attic/spring-data-jdbc-ext#2 (comment)
Reference URL: spring-attic/spring-data-jdbc-ext#2 (comment)
1 votes, 2 watchers
André Rouél opened DATAJDBC-15 and commented
In a table column we use 19-digit IDs. The column type is set to NUMBER. An example of an ID is "1000000009704976470". Now, if we access by using NamedParameterJdbcTemplate.queryForLong (String sql, SqlParameterSource paramSource)
or overloaded methods, it returns the for example the long 1000000009704976512L
instead of "1000000009704976470". The cause lies in the implementation of the method queryForLong
.
The current implementation looks like this:
public long queryForLong(String sql, SqlParameterSource paramSource) throws DataAccessException {
Number number = queryForObject(sql, paramSource, *Number.class*);
return (number != null ? number.longValue() : 0);
}
A solution could look like this:
public long queryForLong(String sql, SqlParameterSource paramSource) throws DataAccessException {
Number number = queryForObject(sql, paramSource, *Long.class*);
return (number != null ? number.longValue() : 0);
}
One more note, the JdbcTemplate
class implements the method queryForLong
properly
Affects: Ext 1.0 M2, Ext 1.0 RC1, Ext 1.0 RELEASE
Issue Links:
Phil Webb opened DATAJDBC-28 and commented
Consider merging the spring-test-dbunit project into Spring Data JDBC. This would supersede SPR-6593 in Spring Core.
The spring-test-dbunit
project provides support for @SetupDatabase
, @TeardownDatabase
, and @ExpectedDatabase
annotations for use within integration tests. See the README in the project for examples and further details.
Issue Links:
Koen Serneels opened DATAJDBC-59 and commented
By default the AQ API returns JMS connections which operate in non "J2EE" compliant mode. One of these side effects is how AQ deals with message priority. Per JMS spec, the priority is defined by a number between 1-9. A higher number means higher priority. By default however, AQ follows its own rules where a higher number is lower priority instead.
This behavior can be influenced by settings a JVM property; oracle.jms.j2eeCompliant to "true", see 11.9 J2EE Compliance. However, the AQ JMS API which is used to create a ConnectionFactory (namely AQjmsFactory) has an overloaded method to pass along a boolean to toggle this as well. This would be much cleaner if we could configure this instead of setting JVM global properties.
As reference: when using the Spring AQ NS configuration, like this: <orcl:aq-jms-connection-factory id="connectionFactory"....> the NS parser: AqJmsConnectionFactoryBeanDefinitionParser eventually uses AqJmsFactoryBeanFactory which does: AQjmsFactory.getConnectionFactory(dataSourceToUse);
The proposition is to add another attribute "jee-compliance" to the element, like this: <orcl:aq-jms-connection-factory id="connectionFactory" jee-compliance="true"....>. This could then be passed along to AqJmsFactoryBeanFactory, which could then use the overloaded method to create a jee compliant connection: AQjmsFactory.getConnectionFactory(dataSourceToUse, BOOLEAN);
Btw; I don't fully understand why j2eecompliant is not default true. It is so that the Oracle AQ API can be used in "raw AQ mode", not requiring the JMS API (and for this the setting makes sense) but 'getConnectionFactory' already returns a JMS ConnectionFactory and hence we are working the "JMS way" already. It seems weird to me that this compliance mode needs to be explicitly enabled in this case. Maybe it makes sense that when this gets implemented the default is "true" anyway
Affects: Ext 1.1 M1
David J. M. Karlsen opened DATAJDBC-14 and commented
The spring-data components depend on slf4j-log4j12 and log4j as runtime dependencies.
IMHO the component should only depend on slf4j-api, and let the end user choose the slf4j/backend implementation they want - this is one of the major reasons to using the api - and not force a dependency on a specific backend logging framework
Referenced from: commits spring-attic/spring-data-jdbc-ext@d1115cd
Thomas Risberg opened DATAJDBC-51 and commented
See GitGub issue: spring-attic/spring-data-jdbc-ext#2
Affects: Ext 1.0 RELEASE
Reference URL: spring-attic/spring-data-jdbc-ext#2
Referenced from: commits spring-attic/spring-data-jdbc-ext@8d1d704
2 votes, 3 watchers
Thomas Risberg opened DATAJDBC-13 and commented
Add JavaDocs and reference docs for new QueryDSL features
No further details from DATAJDBC-13
Thomas Risberg opened DATAJDBC-1 and commented
Provide a new home for the "Advanced Pack for Oracle Database" code. This will provide the base for future development in this area
Referenced from: commits spring-attic/spring-data-jdbc-ext@be33196, spring-attic/spring-data-jdbc-ext@54bd7a3
2 votes, 2 watchers
yumingong opened DATAJDBC-19 and commented
When I use SimpleJdbcInsert.executeAndReturnKey to get the generated key, the spring throws exception: can not cast [java.lang.String] to [java.lang.Number], When i use the executeAndReturnKeyHolder, i can get the primary key, but the key is String, not long type
Affects: Ext 1.0 RC1
Alex Soto opened DATAJDBC-11 and commented
Adding Spring Data Jdbc Extension support for EJP API. EJP (http://www.easierjava.com/) it is called to be a powerful and easy to use relational database persistence API for Java, having no need for mapping annotations or XML configuration, and there is no need to extend any classes or implement any interfaces.
I have forked spring-data-jdbc repository to my github and I have implemented a first version and pushed into github. The url is [email protected]:maggandalf/spring-data-jdbc-ext.git feel free to copy, fork, pull, ...
Only one warning, I have not found EJP in any maven repository (I am talking with EJP developers to see if they can find a solution), so for now this dependency should be added by hand in pom and in local repository
Affects: Ext 1.0 M1
Thomas Risberg opened DATAJDBC-37 and commented
PostgreSQL has some advanced features that we could provide support for:
No further details from DATAJDBC-37
Krzysztof Lorencki opened DATAJDBC-49 and commented
I create two simple Oracle types:
create or replace type MY_SIMPLE_TYPE force as object
(uuid varchar2(32),
uuid_type varchar2(16)
);
CREATE OR REPLACE TYPE MY_SIMPLE_TYPE_ARRAY AS TABLE OF MY_SIMPLE_TYPE;
Next I create a package:
create or replace package xxx
is
function GetList return my_simple_type_array;
PROCEDURE SETLIST(X MY_SIMPLE_TYPE_ARRAY);
end;
with following body:
create or replace package body XXX
is
function GetList return my_simple_type_array
is
begin
return my_simple_type_array(my_simple_type('1234567890','X'),my_simple_type('ABCDEF','Y'));
end;
procedure SETLIST(x my_simple_type_array)
is
begin
raise_application_error(-20111,x.count);
end;
end;
Now I'll try to execute function GetList. I create a wrapper for my Oracle type:
public class My_simple_type_wrapper implements SQLData {
public My_simple_type_wrapper(String uuid, String type) {
this.uuid = uuid;
this.type = type;
}
public My_simple_type_wrapper() {
}
private String uuid;
private String type;
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getSQLTypeName() throws SQLException {
return "MY_SIMPLE_TYPE";
}
public void readSQL(SQLInput stream, String typeName) throws SQLException {
setUuid(stream.readString());
setType(stream.readString());
}
public void writeSQL(SQLOutput stream) throws SQLException {
stream.writeString(uuid);
stream.writeString(this.type);
}
}
And try to execute my function:
Map in = Collections.emptyMap();
My_simple_type_wrapper[] executeFunction = new SimpleJdbcCall(this.getJdbcTemplate())
.withCatalogName("XXX")
.withFunctionName("GetList")
.withoutProcedureColumnMetaDataAccess()
.declareParameters(new
SqlOutParameter("return",Types.ARRAY,"MY_SIMPLE_TYPE_ARRAY", new
SqlReturnArray()))
.executeFunction(My_simple_type_wrapper[].class,in);
After execution I get following error:
[Ljava.lang.Object; cannot be cast to [My_simple_type_wrapper
It seems that that is some casting problem. executeFunction returns array of object (STRUCT object in fact instead of my My_simple_type_wrapper class). Same code works perfect for simple type like:
CREATE OR REPLACE TYPE actor_name_array AS table OF VARCHAR2(50);
It returns array of String as excepted.It seems that you're not able to find my wrapper class when output parameter is used. There is no problem with input parameters - works as excepted with My_simple_type_wrapper
Affects: Ext 1.0 RELEASE
Thomas Risberg opened DATAJDBC-38 and commented
See: http://sourceforge.net/projects/pljson/
No further details from DATAJDBC-38
Ashish Bilochi opened DATAJDBC-44 and commented
JDBCTEMPLATE performs non padded comparison for CHAR sql Type. If a field has CHAR type in database table and the data in that table has length lesser then the size of field, select query will not return any row.
For eg :
Table : Account
Field ACCT_CODE CHAR(4)
Value in database = 'CON '
sql Select * from ACCOUNT a where a.ACCT_CODE = ?
jdbctemplate.query(sql, new Object[]{"CON"}, new RowCallbackHandler());
This will not return any row since "CON" does not matches "CON ".
Affects: Ext 1.0 M1, Ext 1.0 M2, Ext 1.0 RC1, Ext 1.0 RC2, Ext 1.0 RC3, Ext 1.0 RC4, Ext 1.0 RELEASE
Thomas Risberg opened DATAJDBC-32 and commented
Affects: Ext 1.0 RC2
Referenced from: commits spring-attic/spring-data-jdbc-ext@14c67bf
Oliver Drotbohm opened DATAJDBC-20 and commented
We could provide Spring Data repositories support for the JDBC module based on the QuerydslJdbcTemplate
Issue Links:
3 votes, 5 watchers
Serkan ÖZAL opened DATAJDBC-58 and commented
Hi all,
I share my open-source project on Spring JDBC RowMapper. Maybe it can be published under Spring-Data-JDBC distribution. It's URL is https://github.com/serkan-ozal/spring-jdbc-roma-impl.
There are other lots of interesting features and these features can be customized with developer's extended classes. It has some new and unique features like conditional lazy, conditional lazy object loading and conditional field ignoring. In addition, it has custom expression language named RXEL (ROMA Expression Language).
Spring-JDBC-ROMA is a rowmapper extension for Spring-JDBC module. There is already a rowmapper named org.springframework.jdbc.core.BeanPropertyRowMappe r for binding resultset attributes to object. But it is reflection based and can cause performance problems as Spring developers said. However Spring-JDBC-ROMA is not reflection based and it is byte code generation (with CGLib and Javassist) based rowmapper. It generates rowmapper on the fly like implementing as manual so it has no performance overhead. It also supports object relations as lazy and eager. There are other lots of interesting features and these features can be customized with developer's extended classes.
Features:
All primitive types, strings, enums, dates, clob, blob, collections and complex objects are supported.
Writing your custom class (or type) based field generator factory, object creater, object processor, table name resolver, column name resolver implementations and customizable data source, schema, table names are supported.
Writing your custom field based mapper, SQL based binder, expression language based binder and custom binder implementations are supported.
Lazy or eager field accessing is supported. Lazy support can be configured as conditional and conditions can be provided as expression language or as custom lazy condition provider implementations. If lazy condition is not enable, specified field is not handled as lazy and set as eager while creating root entity.
Loading lazy fields can be enable or disable at runtime dynamically by using key based, expression based and custom implementation based approaches. If lazy-load condition is not enable, specified lazy field is not loaded no matter field is configured as lazy.
Ignoring fields can be enable or disable at runtime dynamically by using key based, expression based and custom implementation based approaches. This feature is very useful in some use-cases. For example, this feature can be used to ignore some fields while serializing to JSON at your specified controller and this behaviour doesn't effect other controllers.
Writing field access definitions as REXL (ROMA Expression Language) or as compilable Java code in annotation. XML and properties file configuration support will be added soon
Reference URL: https://github.com/serkan-ozal/spring-jdbc-roma-impl
Thomas Risberg opened DATAJDBC-2 and commented
Provide a new home for support for MyBatis 3 going forward.
The iBatis 3 beta 1 introduced API changes which break the existing Spring Framework support and the move to MyBatis could potentially introduce more breaking changes. See the Spring Framework JIRA issue SPR-5991 for comments and code contributions
Issue Links:
14 votes, 17 watchers
Thomas Risberg opened DATAJDBC-54 and commented
See PR in GitHub
Affects: Ext 1.0 RELEASE
Reference URL: spring-attic/spring-data-jdbc-ext#5
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.