Git Product home page Git Product logo

spring-data-relational's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

spring-data-relational's Issues

AdtMessageListenerContainer doesn't support durable named consumer. [DATAJDBC-42]

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

annotation based spring-jdbc [DATAJDBC-82]

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.

  • Annotation based queries.
  • Mapper annotation for bean mappers
  • Batch query support
  • Returning generated id from jdbc driver
  • Map or List types support
  • Container based return types such as Collections or Guava Optional or something else
  • Parameter type support.

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:

  • DATAJDBC-116 Add SQL annotations like in JDBI
    ("is duplicated by")

4 votes, 11 watchers

JPA Annotations and Spring Data for JDBCTemplate [DATAJDBC-24]

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:

  • DATAJDBC-20 Add repositories support based on Querydsl

Multiple lines commit by producer --> Only one line receive by consumer [DATAJDBC-52]

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:

Missing system property placeholder resolving in orcl:pooling-data-source [DATAJDBC-45]

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

Spring JDBC ORM Like RowMapper [DATAJDBC-46]

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

Transaction issues with JDBC calls + AQ [DATAJDBC-9]

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

  • commit
    message sended
    insert done
    ending new transaction
  • rollback
    insert done
    Done processing message.
  • commit
  • rollback

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

  • commit
  • rollback

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:

JmsTemplate is unaware of shared local transaction [DATAJDBC-39]

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

SqlCall calculates the number of input parameters wrong [DATAJDBC-7]

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

i use jdbcTemplate save clob data,then throws Invalid argument value: java.io.NotSerializableException [DATAJDBC-56]

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

QueryDslJdbcTemplate#queryForObject(SQLQuery, ExpressionBase<T>) should accept Expression<T> as 2nd param [DATAJDBC-34]

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

Reference URL: https://github.com/SpringSource/spring-data-jdbc-ext/blob/master/spring-data-jdbc-core/src/main/java/org/springframework/data/jdbc/query/QueryDslJdbcTemplate.java#L206

Referenced from: commits spring-attic/spring-data-jdbc-ext@3225617

1 votes, 2 watchers

Provide support for using QueryDSL SQL with JdbcTemplate [DATAJDBC-6]

Missing Import-Package lines in OSGi manifest [DATAJDBC-18]

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

Add pagination abstraction [DATAJDBC-29]

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:

3 votes, 4 watchers

CUBRID Database Support through its JDBC Driver [PATCH INCLUDED] [DATAJDBC-10]

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:

  • sql-error-codes.xml: the classifications of error codes.
  • CubridSequenceMaxValueIncrementer.java: retrieves the next value of a given CUBRID sequence.

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:

Accessing Timestamp field from SQLite db using JdbcTemplate [DATAJDBC-3]

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:

Overload JdbcTemplate.queryForObject to accept a boolean parameter to allow a null value [DATAJDBC-50]

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

JDBC connection leak on JDBC pool when using Oracle AQ in combination with DefaultMessageListenerContainer [DATAJDBC-8]

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:

  • on the orcl:aq-jms-connection-factory: use-local-data-source-transaction="true" and native-jdbc-extractor="oracleNativeJdbcExtractor"
  • HibernateTransactionManager (we use our single DataSource now threefold: plain SQL, AQ and Hibernate)
  • Then we have numerous DefaultMessageListenerContainers to receive (JMS) messages over AQ and invokes our listeners.

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:

  1. DefaultMessageListenerContainer (run() method L939) encouters somehow an error receiving the message/setting up the connection (in our case Q not defined)
  2. In the catch block: recoverAfterListenerSetupFailure() is invoked (L969)
  3. recoverAfterListenerSetupFailure() calls refreshConnectionUntilSuccessful()
  4. refreshConnectionUntilSuccessful calls: Connection con = createConnection(); and then : JmsUtils.closeConnection(con); (L859 & L860; note: completely outside of any TX!)

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

SQLQuery with QueryDslJdbcTemplate returns NullPointerException [DATAJDBC-16]

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 ?

  1. RESULT: dog
    2011-10-04 17:13:11,400 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Returning JDBC Connection to DataSource
    2011-10-04 17:13:11,423 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Fetching JDBC Connection from DataSource
    2011-10-04 17:13:11,432 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Returning JDBC Connection to DataSource
    2011-10-04 17:13:11,438 DEBUG [com.mysema.query.sql.AbstractSQLQuery] query : select employee.id, employee.name
    from employee employee
    where employee.id = ?
    limit ?
    Exception in thread "main" java.lang.NullPointerException
    at com.mysema.query.sql.AbstractSQLQuery.iterateSingle(AbstractSQLQuery.java:434)
    at com.mysema.query.sql.AbstractSQLQuery.iterate(AbstractSQLQuery.java:367)
    at com.mysema.query.sql.AbstractSQLQuery.iterate(AbstractSQLQuery.java:360)
    at com.mysema.query.sql.AbstractSQLQuery.uniqueResult(AbstractSQLQuery.java:576)
    at net.example.querydslsample3.service.AppService.runWithTemplate(AppService.java:43)
    at net.example.querydslsample3.App.main(App.java:19)

Affects: Ext 1.0 M2

Attachments:

Incorrect output of big numbers when using NamedParameterJdbcTemplate.queryForLong [DATAJDBC-15]

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:

  • SPR-8652 Incorrect output of big numbers when using NamedParameterJdbcTemplate.queryForLong
    ("duplicates")

Introduce a TestExecutionListener for DbUnit [DATAJDBC-28]

Phil Webb opened DATAJDBC-28 and commented

Overview

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.

Related Resources


Issue Links:

  • SPR-6593 Introduce a TestExecutionListener for DbUnit

Support for Oracle AQ "J2EECompliance" mode [DATAJDBC-59]

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

Creating Spring Jdbc Extension for EJP (Easy Java Persistence) [DATAJDBC-11]

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

Spring Data JDBC Extensions - function call with Oracle type [DATAJDBC-49]

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

JDBCTEMPLATE performs non padded comparison for CHAR sql Type. [DATAJDBC-44]

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

Spring-JDBC-ROMA 2.0 - Byte Code Generation Based ORM Like Row Mapper Framework [DATAJDBC-58]

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

Add support for MyBatis 3 [DATAJDBC-2]

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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.