You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-java@ibatis.apache.org by Alex Perez <qu...@gmail.com> on 2008/04/12 13:20:56 UTC

Sybase OEM

Hi All,

I'm trying to adapt an existing application running with ibatis, to work
with sybase.

To write the sqlpmaps, I've just rewrited the SQL server 2000 ones, and just
worked ok. The tests were done with Sybase ASA 9.x (the "enterprie
version").

The problem begins when trying to get it working with Sybase OEM, that it's
the same databae enginte, but ready to embed into applications. My company
has a OEM contract to use this engine as an embedded database in our
products. But (and here starts the nightmare), due to some license
restrictions it's mandatory send a sentence each time you start a connection
database like:

SET TEMPORARY OPTION connection_authentication="XXXXXXXXXXXXX" [really a
very large string]

Otherwise you'll only be able to send select statements to the database, and
get disconnected after 10 seconds aprox.

The first attempt was, in my sybase-database.properties, put a jdbc url:

jdbc:sybase:localhost:port?ServiceName=database_name?sqlinitstring="set
temporary ........"

But I get an exception due to the driver. It seems like the jdbc url cannot
be longer than 253 chars, and the auth_string is about 500 chars long.

Also I 've tried to send this "set option" trought an ibatis "update"
statements, like an stored procedure, but unsuccessfully.

The last test to get it working, was:
In this code:
http://www.mirthproject.org/fisheye/browse/Mirth/tags/1.7.0/server/src/com/webreach/mirth/server/util/SqlConfig.java?r=2754

after the .buildSqlMapClient() call, doing a (in pseudo-code)

conn = sqlMap.getDatasource().getConnection();
Statement stmt = conn.createStatement();
stmt.execute("set temporary ....");
stmt.commit();

To try to bypass Ibatis layer [yes, it's horrible]

Could anyone help me to figure out how can I send the "set temporary option
..." for every connection created to the database ?

thanks in advance.


-- 
3rd Law of Computing:
Anything that can go wrSegmentation fault -- core dumped.

Re: Sybase OEM

Posted by Alex Perez <qu...@gmail.com>.
Thanks Jeff,

I've extended from JDBCTransaction and JDBCTransactionConfig and it worked
perfectly!


2008/4/12, Jeff Butler <je...@gmail.com>:
>
> I have that *not quite* right - you need to also override the
> TransactionConfig and specify *that* class in the SqlMapConfig.xml file.
>
> Jeff Butler
>
>
>
> On Sat, Apr 12, 2008 at 7:12 AM, Jeff Butler <je...@gmail.com>
> wrote:
>
> > I think your last option is not that bad - it centralizes the
> > initialization of the Connection.
> >
> > Another option with iBATIS is to implement your own transaction
> > manager.  Write a class that subclasses the current transaction manager you
> > are using and override the getConnection() method.  Look in the package
> > com.ibatis.sqlmap.engine.transaction and subpackages to see the code for the
> > iBATIS supplied transaction managers.  In the overridden method, initialize
> > the connection before returning it.
> >
> > In your sqlMapConfig.xml file, you can specify your new transaction
> > manager:
> >
> > <transactionManager type="com.mycompany.MyTransactionManager">
> >   ...
> > </transactionManager>
> >
> > For example,
> >
> > public class MyTransactionManager extends JdbcTransaction {
> >
> >   @Override
> >   public Connection getConnection() throws SQLException,
> > TransactionException {
> >     Connection conn = super.getConnection();
> >      Statement stmt = conn.createStatement();
> >     stmt.execute("set temporary ....");
> >     return conn;
> >   }
> > }
> >
> > Jeff Butler
> >
> >
> >
> > On Sat, Apr 12, 2008 at 6:20 AM, Alex Perez <qu...@gmail.com> wrote:
> >
> > > Hi All,
> > >
> > > I'm trying to adapt an existing application running with ibatis, to
> > > work with sybase.
> > >
> > > To write the sqlpmaps, I've just rewrited the SQL server 2000 ones,
> > > and just worked ok. The tests were done with Sybase ASA 9.x (the "enterprie
> > > version").
> > >
> > > The problem begins when trying to get it working with Sybase OEM, that
> > > it's the same databae enginte, but ready to embed into applications. My
> > > company has a OEM contract to use this engine as an embedded database in our
> > > products. But (and here starts the nightmare), due to some license
> > > restrictions it's mandatory send a sentence each time you start a connection
> > > database like:
> > >
> > > SET TEMPORARY OPTION connection_authentication="XXXXXXXXXXXXX" [really
> > > a very large string]
> > >
> > > Otherwise you'll only be able to send select statements to the
> > > database, and get disconnected after 10 seconds aprox.
> > >
> > > The first attempt was, in my sybase-database.properties, put a jdbc
> > > url:
> > >
> > > jdbc:sybase:localhost:port?ServiceName=database_name?sqlinitstring="set
> > > temporary ........"
> > >
> > > But I get an exception due to the driver. It seems like the jdbc url
> > > cannot be longer than 253 chars, and the auth_string is about 500 chars
> > > long.
> > >
> > > Also I 've tried to send this "set option" trought an ibatis "update"
> > > statements, like an stored procedure, but unsuccessfully.
> > >
> > > The last test to get it working, was:
> > > In this code:
> > > http://www.mirthproject.org/fisheye/browse/Mirth/tags/1.7.0/server/src/com/webreach/mirth/server/util/SqlConfig.java?r=2754
> > >
> > > after the .buildSqlMapClient() call, doing a (in pseudo-code)
> > >
> > > conn = sqlMap.getDatasource().getConnection();
> > > Statement stmt = conn.createStatement();
> > > stmt.execute("set temporary ....");
> > > stmt.commit();
> > >
> > > To try to bypass Ibatis layer [yes, it's horrible]
> > >
> > > Could anyone help me to figure out how can I send the "set temporary
> > > option ..." for every connection created to the database ?
> > >
> > > thanks in advance.
> > >
> > >
> > > --
> > > 3rd Law of Computing:
> > > Anything that can go wrSegmentation fault -- core dumped.
> >
> >
> >
>


-- 
3rd Law of Computing:
Anything that can go wrSegmentation fault -- core dumped.

Re: Sybase OEM

Posted by Jeff Butler <je...@gmail.com>.
I have that *not quite* right - you need to also override the
TransactionConfig and specify *that* class in the SqlMapConfig.xml file.

Jeff Butler



On Sat, Apr 12, 2008 at 7:12 AM, Jeff Butler <je...@gmail.com> wrote:

> I think your last option is not that bad - it centralizes the
> initialization of the Connection.
>
> Another option with iBATIS is to implement your own transaction manager.
> Write a class that subclasses the current transaction manager you are using
> and override the getConnection() method.  Look in the package
> com.ibatis.sqlmap.engine.transaction and subpackages to see the code for the
> iBATIS supplied transaction managers.  In the overridden method, initialize
> the connection before returning it.
>
> In your sqlMapConfig.xml file, you can specify your new transaction
> manager:
>
> <transactionManager type="com.mycompany.MyTransactionManager">
>   ...
> </transactionManager>
>
> For example,
>
> public class MyTransactionManager extends JdbcTransaction {
>
>   @Override
>   public Connection getConnection() throws SQLException,
> TransactionException {
>     Connection conn = super.getConnection();
>      Statement stmt = conn.createStatement();
>     stmt.execute("set temporary ....");
>     return conn;
>   }
> }
>
> Jeff Butler
>
>
>
> On Sat, Apr 12, 2008 at 6:20 AM, Alex Perez <qu...@gmail.com> wrote:
>
> > Hi All,
> >
> > I'm trying to adapt an existing application running with ibatis, to work
> > with sybase.
> >
> > To write the sqlpmaps, I've just rewrited the SQL server 2000 ones, and
> > just worked ok. The tests were done with Sybase ASA 9.x (the "enterprie
> > version").
> >
> > The problem begins when trying to get it working with Sybase OEM, that
> > it's the same databae enginte, but ready to embed into applications. My
> > company has a OEM contract to use this engine as an embedded database in our
> > products. But (and here starts the nightmare), due to some license
> > restrictions it's mandatory send a sentence each time you start a connection
> > database like:
> >
> > SET TEMPORARY OPTION connection_authentication="XXXXXXXXXXXXX" [really a
> > very large string]
> >
> > Otherwise you'll only be able to send select statements to the database,
> > and get disconnected after 10 seconds aprox.
> >
> > The first attempt was, in my sybase-database.properties, put a jdbc url:
> >
> > jdbc:sybase:localhost:port?ServiceName=database_name?sqlinitstring="set
> > temporary ........"
> >
> > But I get an exception due to the driver. It seems like the jdbc url
> > cannot be longer than 253 chars, and the auth_string is about 500 chars
> > long.
> >
> > Also I 've tried to send this "set option" trought an ibatis "update"
> > statements, like an stored procedure, but unsuccessfully.
> >
> > The last test to get it working, was:
> > In this code:
> > http://www.mirthproject.org/fisheye/browse/Mirth/tags/1.7.0/server/src/com/webreach/mirth/server/util/SqlConfig.java?r=2754
> >
> > after the .buildSqlMapClient() call, doing a (in pseudo-code)
> >
> > conn = sqlMap.getDatasource().getConnection();
> > Statement stmt = conn.createStatement();
> > stmt.execute("set temporary ....");
> > stmt.commit();
> >
> > To try to bypass Ibatis layer [yes, it's horrible]
> >
> > Could anyone help me to figure out how can I send the "set temporary
> > option ..." for every connection created to the database ?
> >
> > thanks in advance.
> >
> >
> > --
> > 3rd Law of Computing:
> > Anything that can go wrSegmentation fault -- core dumped.
>
>
>

Re: Sybase OEM

Posted by Jeff Butler <je...@gmail.com>.
I think your last option is not that bad - it centralizes the initialization
of the Connection.

Another option with iBATIS is to implement your own transaction manager.
Write a class that subclasses the current transaction manager you are using
and override the getConnection() method.  Look in the package
com.ibatis.sqlmap.engine.transaction and subpackages to see the code for the
iBATIS supplied transaction managers.  In the overridden method, initialize
the connection before returning it.

In your sqlMapConfig.xml file, you can specify your new transaction manager:

<transactionManager type="com.mycompany.MyTransactionManager">
  ...
</transactionManager>

For example,

public class MyTransactionManager extends JdbcTransaction {

  @Override
  public Connection getConnection() throws SQLException,
TransactionException {
    Connection conn = super.getConnection();
    Statement stmt = conn.createStatement();
    stmt.execute("set temporary ....");
    return conn;
  }
}

Jeff Butler



On Sat, Apr 12, 2008 at 6:20 AM, Alex Perez <qu...@gmail.com> wrote:

> Hi All,
>
> I'm trying to adapt an existing application running with ibatis, to work
> with sybase.
>
> To write the sqlpmaps, I've just rewrited the SQL server 2000 ones, and
> just worked ok. The tests were done with Sybase ASA 9.x (the "enterprie
> version").
>
> The problem begins when trying to get it working with Sybase OEM, that
> it's the same databae enginte, but ready to embed into applications. My
> company has a OEM contract to use this engine as an embedded database in our
> products. But (and here starts the nightmare), due to some license
> restrictions it's mandatory send a sentence each time you start a connection
> database like:
>
> SET TEMPORARY OPTION connection_authentication="XXXXXXXXXXXXX" [really a
> very large string]
>
> Otherwise you'll only be able to send select statements to the database,
> and get disconnected after 10 seconds aprox.
>
> The first attempt was, in my sybase-database.properties, put a jdbc url:
>
> jdbc:sybase:localhost:port?ServiceName=database_name?sqlinitstring="set
> temporary ........"
>
> But I get an exception due to the driver. It seems like the jdbc url
> cannot be longer than 253 chars, and the auth_string is about 500 chars
> long.
>
> Also I 've tried to send this "set option" trought an ibatis "update"
> statements, like an stored procedure, but unsuccessfully.
>
> The last test to get it working, was:
> In this code:
> http://www.mirthproject.org/fisheye/browse/Mirth/tags/1.7.0/server/src/com/webreach/mirth/server/util/SqlConfig.java?r=2754
>
> after the .buildSqlMapClient() call, doing a (in pseudo-code)
>
> conn = sqlMap.getDatasource().getConnection();
> Statement stmt = conn.createStatement();
> stmt.execute("set temporary ....");
> stmt.commit();
>
> To try to bypass Ibatis layer [yes, it's horrible]
>
> Could anyone help me to figure out how can I send the "set temporary
> option ..." for every connection created to the database ?
>
> thanks in advance.
>
>
> --
> 3rd Law of Computing:
> Anything that can go wrSegmentation fault -- core dumped.