I dug a little deeper. Forgot about this... public JdbcDaoTransaction(DataSource dataSource) { try { connection = dataSource.getConnection(); if (connection == null) { throw new DaoException("Could not start transaction. Cause: The DataSource returned a null connection."); } if (connection.getAutoCommit()) { connection.setAutoCommit(false); } if (connectionLog.isDebugEnabled()) { connection = ConnectionLogProxy.newInstance(connection); } } catch (SQLException e) { throw new DaoException("Error starting JDBC transaction. Cause: " + e); } }
You can see that when logging at a debugging level is enabled you get a proxy. This would interfere with casting to an oracle connection for sure. if (connectionLog.isDebugEnabled()) { connection = ConnectionLogProxy.newInstance(connection); } Otherwise you should get a straight connection. Brandon On 4/19/05, Brandon Goodin <[EMAIL PROTECTED]> wrote: > It's not a proxy. Here are the steps that the DAO Framework takes to > setup JNDI with JdbcTransactionManager. > > During the parsing of the Dao configuration file the configure method > is called for the transaction manager: > > public class JdbcDaoTransactionManager implements DaoTransactionManager { > > ... > > public void configure(Properties properties) { > if (properties.containsKey("DataSource")) { > String type = (String) properties.get("DataSource"); > if ("SIMPLE".equals(type)) { > configureSimpleDataSource(properties); > } else if ("DBCP".equals(type)) { > configureDbcp(properties); > } else if ("JNDI".equals(type)) { > configureJndi(properties); > } else { > throw new DaoException("DAO Transaction Manager properties > must include a value for 'DataSource' of SIMPLE, DBCP or JNDI."); > } > } else { > throw new DaoException("DAO Transaction Manager properties must > include a value for 'DataSource' of SIMPLE, DBCP or JNDI."); > } > } > ... > > which calls the configureJndi(properties) method and sets the datasource. > > ... > private void configureJndi(Map properties) { > try { > Hashtable contextProps = getContextProperties(properties); > InitialContext initCtx = null; > if (contextProps == null) { > initCtx = new InitialContext(); > } else { > initCtx = new InitialContext(contextProps); > } > dataSource = (DataSource) initCtx.lookup((String) > properties.get("DBJndiContext")); > } catch (NamingException e) { > throw new DaoException("There was an error configuring the > DataSource from JNDI. Cause: " + e, e); > } > } > ... > > As you can see it is a straight datasource that is created... no proxies. > > Your Dao class would extend the JdbcDaoTemplate which would provide > you access to the connection for the current transaction. Again you > can see that there are no proxies. > > public abstract class JdbcDaoTemplate extends DaoTemplate { > ... > /** > * Gets the JDBC Connection associated with the current > * DaoTransaction that this Dao is working under. > * > * @return A JDBC Connection instance. > */ > protected Connection getConnection() { > DaoTransaction trans = daoManager.getTransaction(this); > if (!(trans instanceof ConnectionDaoTransaction)) { > throw new DaoException("The DAO manager of type " + > daoManager.getClass().getName() + > " cannot supply a JDBC Connection for this template, and is > therefore not" + > "supported by JdbcDaoTemplate."); > } > return ((ConnectionDaoTransaction) trans).getConnection(); > } > ... > } > > I hope that helps, > Brandon > > On 4/19/05, Richard Osbaldeston <[EMAIL PROTECTED]> wrote: > > Its a bit late for that, I've just butchered the code removing all > > traces of IBatis.. Out of interest whats the class of the returned > > connection, conn? I notice you don't close it so its likely to be > > another proxy - in which case it dosnt help as I cant create a oracle > > array descriptor using it (classcastexception). > > > > - Richard > > > > Brandon Goodin wrote: > > > > >Richard, > > > > > >If you configure your oracle datasrouce via JNDI you should have no > > >problem accomplishing what you want. > > > > > >Example: > > > > > >public class JdbcAccountDao extends JdbcDaoTemplate implements AccountDao { > > >... > > > public JdbcAccountDao(DaoManager daoManager) { > > > super(daoManager); > > > } > > >... > > > > > > public Account findAccount(int id) { > > > Account account = null; > > > Connection conn = getConnection(); > > > PreparedStatement ps = null; > > > ResultSet rs = null; > > > try { > > > ps = conn.prepareStatement(SELECT); > > > ps.setInt(1, id); > > > rs = ps.executeQuery(); > > > while (rs.next()) { > > > account = new Account(); > > > account.setId(rs.getInt("id")); > > > account.setFirstName(rs.getString("firstName")); > > > account.setLastName(rs.getString("lastName")); > > > account.setEmailAddress(rs.getString("emailAddress")); > > > } > > > } catch (SQLException e) { > > > throw new DaoException("Error finding Account. Cause: " + e, e); > > > } finally { > > > closeResultSet(rs); > > > closePreparedStatement(ps); > > > } > > > return account; > > > } > > >... > > >} > > > > > > > > >Brandon > > > > > >On 4/19/05, Richard Osbaldeston <[EMAIL PROTECTED]> wrote: > > > > > > > > >>Brandon Goodin wrote: > > >> > > >> > > >> > > >>>I thought Oracle has a pooled connection datasource. Would it be > > >>>possible to use oracle's datasource via JNDI? I would think that their > > >>>implementation would provide what you need. > > >>> > > >>>Brandon > > >>> > > >>> > > >>> > > >>> > > >>Hmmm, only if I could still get hold of the 'real' connection and not > > >>the proxy that IBatis returns (I guess so the IBatis developer dosnt > > >>have to worry about closing it correctly). But the fact that they'res > > >>more than one way to configure the datasources strongly suggests I'm > > >>barking up the wrong tree with the bugs in SimpleDataSource.. if the > > >>user configures a different datasource the same problem will re-occur. > > >>Guess there's just too much Oracle in this equation.. I'll have to drop > > >>IBatis from this project. Shame (and a lot of back-pedalling on my > > >>account). > > >> > > >>- Richard > > >> > > >> > > >> > > > > > > > > > > > > > >