type=page
status=published
title=Using the JDBC API for Database Access
next=transaction-service.html
prev=part-services-and-apis.html
~~~~~~

= Using the JDBC API for Database Access

[[GSDVG00017]][[beamj]]


[[using-the-jdbc-api-for-database-access]]
== 14 Using the JDBC API for Database Access

This chapter describes how to use the Java Database Connectivity (JDBC)
API for database access with the {productName}. This chapter
also provides high level JDBC implementation instructions for servlets
and EJB components using the {productName}.

The JDBC specifications are available at
`http://www.oracle.com/technetwork/java/javase/jdbc/index.html`.

A useful JDBC tutorial is located at
`http://docs.oracle.com/javase/tutorial/jdbc/index.html`.


[NOTE]
====
The {productName} does not support connection pooling or transactions
for an application's database access if it does not use standard Jakarta EE
`DataSource` objects.
====


The following topics are addressed here:

* link:#giyck[Statements]
* link:#giyeq[Connections]
* link:#giyde[Connection Wrapping]
* link:#gavro[Allowing Non-Component Callers]
* link:#giydx[Using Application-Scoped Resources]
* link:#geqvg[Restrictions and Optimizations]

[[giyck]][[GSDVG00182]][[statements]]

=== Statements

The following topics are addressed here:

* link:#giyfu[Using an Initialization Statement]
* link:#ghqrx[Setting a Statement Timeout]
* link:#gktbf[Statement Leak Detection and Leaked Statement Reclamation]
* link:#giyci[Statement Caching]
* link:#giygg[Statement Tracing]

[[giyfu]][[GSDVG00495]][[using-an-initialization-statement]]

==== Using an Initialization Statement

You can specify a statement that executes each time a physical
connection to the database is created (not reused) from a JDBC
connection pool. This is useful for setting request or session specific
properties and is suited for homogeneous requests in a single
application. Set the Init SQL attribute of the JDBC connection pool to
the SQL string to be executed in one of the following ways:

* Enter an Init SQL value in the Edit Connection Pool Advanced
Attributes page in the Administration Console. For more information,
click the Help button in the Administration Console.
* Specify the `--initsql` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `init-sql` option in the `asadmin set` command. For
example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.init-sql="sql-string"
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].

[[ghqrx]][[GSDVG00496]][[setting-a-statement-timeout]]

==== Setting a Statement Timeout

An abnormally long running JDBC query executed by an application may
leave it in a hanging state unless a timeout is explicitly set on the
statement. Setting a statement timeout guarantees that all queries
automatically time out if not completed within the specified period.
When statements are created, the `queryTimeout` is set according to the
statement timeout setting. This works only when the underlying JDBC
driver supports `queryTimeout` for `Statement`, `PreparedStatement`,
`CallableStatement`, and `ResultSet`.

You can specify a statement timeout in the following ways:

* Enter a Statement Timeout value in the Edit Connection Pool Advanced
Attributes page in the Administration Console. For more information,
click the Help button in the Administration Console.
* Specify the `--statementtimeout` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].

[[gktbf]][[GSDVG00497]][[statement-leak-detection-and-leaked-statement-reclamation]]

==== Statement Leak Detection and Leaked Statement Reclamation

If statements are not closed by an application after use, it is possible
for the application to run out of cursors. Enabling statement leak
detection causes statements to be considered as leaked if they are not
closed within a specified period. Additionally, leaked statements can
reclaimed automatically.

To enable statement leak detection, set Statement Leak Timeout In
Seconds for the JDBC connection pool to a positive, nonzero value in one
of the following ways:

* Specify the `--statementleaktimeout` option in the
`create-jdbc-connection-pool` subcommand. For more information, see
link:reference-manual/create-jdbc-connection-pool.html#GSRFM00036[`create-jdbc-connection-pool`(1)].
* Specify the `statement-leak-timeout-in-seconds` option in the `set`
subcommand. For example:
+
[source]
----
asadmin set resources.jdbc-connection-pool.pool-name.statement-leak-timeout-in-seconds=300
----

When selecting a value for Statement Leak Timeout In Seconds, make sure
that:

* It is less than the Connection Leak Timeout; otherwise, the connection
could be closed before the statement leak is recognized.
* It is greater than the Statement Timeout; otherwise, a long running
query could be mistaken as a statement leak.

After enabling statement leak detection, enable leaked statement
reclamation by setting Reclaim Leaked Statements for the JDBC connection
pool to a `true` value in one of the following ways:

* Specify the `--statementleakreclaim=true` option in the
`create-jdbc-connection-pool` subcommand. For more information, see
link:reference-manual/create-jdbc-connection-pool.html#GSRFM00036[`create-jdbc-connection-pool`(1)].
* Specify the `statement-leak-reclaim` option in the `set` subcommand.
For example:
+
[source]
----
asadmin set resources.jdbc-connection-pool.pool-name.statement-leak-reclaim=true
----

[[giyci]][[GSDVG00498]][[statement-caching]]

==== Statement Caching

Statement caching stores statements, prepared statements, and callable
statements that are executed repeatedly by applications in a cache,
thereby improving performance. Instead of the statement being prepared
each time, the cache is searched for a match. The overhead of parsing
and creating new statements each time is eliminated.

Statement caching is usually a feature of the JDBC driver. The {productName} provides caching for drivers that do not support caching. To
enable this feature, set the Statement Cache Size for the JDBC
connection pool in one of the following ways:

* Enter a Statement Cache Size value in the Edit Connection Pool
Advanced Attributes page in the Administration Console. For more
information, click the Help button in the Administration Console.
* Specify the `--statementcachesize` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `statement-cache-size` option in the `asadmin set`
command. For example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.statement-cache-size=10
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].

By default, this attribute is set to zero and the statement caching is
turned off. To enable statement caching, you can set any positive
nonzero value. The built-in cache eviction strategy is LRU-based (Least
Recently Used). When a connection pool is flushed, the connections in
the statement cache are recreated.

[[giygg]][[GSDVG00499]][[statement-tracing]]

==== Statement Tracing

You can trace the SQL statements executed by applications that use a
JDBC connection pool. Set the SQL Trace Listeners attribute to a
comma-separated list of trace listener implementation classes in one of
the following ways:

* Enter an SQL Trace Listeners value in the Edit Connection Pool
Advanced Attributes page in the Administration Console. For more
information, click the Help button in the Administration Console.
* Specify the `--sqltracelisteners` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `sql-trace-listeners` option in the `asadmin set` command.
For example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.sql-trace-listeners=listeners
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].

The {productName} provides a public interface,
org.glassfish.api.jdbc.SQLTraceListener , that implements a means of
recording `SQLTraceRecord` objects. To make custom implementations of
this interface available to the {productName}, place the
implementation classes in as-install``/lib``.

The {productName} provides an SQL tracing logger to log the SQL
operations in the form of `SQLTraceRecord` objects in the `server.log`
file. The module name under which the SQL operation is logged is
`jakarta.enterprise.resource.sqltrace`. SQL traces are logged as FINE
messages along with the module name to enable easy filtering of the SQL
logs. A sample SQL trace record looks like this:

[source]
----
[#|2009-11-27T15:46:52.202+0530|FINE|glassfish 6.0|jakarta.enterprise.resource.sqltrace.com.sun.gjc.util
|_ThreadID=29;_ThreadName=Thread-1;ClassName=com.sun.gjc.util.SQLTraceLogger;MethodName=sqlTrace;
|ThreadID=77 | ThreadName=p: thread-pool-1; w: 6 | TimeStamp=1259317012202
| ClassName=com.sun.gjc.spi.jdbc40.PreparedStatementWrapper40 | MethodName=executeUpdate
| arg[0]=insert into table1(colName) values(100) | arg[1]=columnNames | |#]
----

This trace shows that an `executeUpdate(String sql, String columnNames)`
operation is being done.

When SQL statement tracing is enabled and JDBC connection pool
monitoring is enabled, {productName} maintains a tracing cache of
recent queries and their frequency of use. The following JDBC connection
pool properties can be configured to control this cache and the
monitoring statistics available from it:

`time-to-keep-queries-in-minutes`::
  Specifies how long in minutes to keep a query in the tracing cache,
  tracking its frequency of use. The default value is 5 minutes.
`number-of-top-queries-to-report`::
  Specifies how many of the most used queries, in frequency order, are
  listed the monitoring report. The default value is 10 queries.

Set these parameters in one of the following ways:

* Add them as properties in the Edit JDBC Connection Pool Properties
page in the Administration Console. For more information, click the Help
button in the Administration Console.
* Specify them using the `--property` option in the
`create-jdbc-connection-pool` subcommand. For more information, see
link:reference-manual/create-jdbc-connection-pool.html#GSRFM00036[`create-jdbc-connection-pool`(1)].
* Set them using the `set` subcommand. For example:
+
[source]
----
asadmin set resources.jdbc-connection-pool.pool-name.property.time-to-keep-queries-in-minutes=10
----

[[giyeq]][[GSDVG00183]][[connections]]

=== Connections

The following topics are addressed here:

* link:#gktas[Transparent Pool Reconfiguration]
* link:#giygl[Disabling Pooling]
* link:#giydr[Associating Connections with Threads]
* link:#giyfg[Custom Connection Validation]
* link:#beams[Sharing Connections]
* link:#gezfh[Marking Bad Connections]
* link:#gipzl[Handling Invalid Connections]

[[gktas]][[GSDVG00500]][[transparent-pool-reconfiguration]]

==== Transparent Pool Reconfiguration

When the properties or attributes of a JDBC connection pool are changed,
the connection pool is destroyed and re-created. Normally, applications
using the connection pool must be redeployed as a consequence. This
restriction can be avoided by enabling transparent JDBC connection pool
reconfiguration. When this feature is enabled, applications do not need
to be redeployed. Instead, requests for a new connections are blocked
until the reconfiguration operation completes. Connection requests from
any in-flight transactions are served using the old pool configuration
so as to complete the transaction. Then, connections are created using
the pool's new configuration, and any blocked connection requests are
served with connections from the re-created pool..

To enable transparent JDBC connection pool reconfiguration, set the
`dynamic-reconfiguration-wait-timeout-in-seconds` property of the JDBC
connection pool to a positive, nonzero value in one of the following
ways:

* Add it as a property in the Edit JDBC Connection Pool Properties page
in the Administration Console. For more information, click the Help
button in the Administration Console.
* Specify it using the `--property` option in the
`create-jdbc-connection-pool` subcommand. For more information, see
link:reference-manual/create-jdbc-connection-pool.html#GSRFM00036[`create-jdbc-connection-pool`(1)].
* Set it using the `set` subcommand. For example:
+
[source]
----
asadmin set resources.jdbc-connection-pool.pool-name.property.dynamic-reconfiguration-wait-timeout-in-seconds=15
----

This property specifies the time in seconds to wait for in-use
connections to close and in-flight transactions to complete. Any
connections in use or transaction in flight past this time must be
retried.

[[giygl]][[GSDVG00501]][[disabling-pooling]]

==== Disabling Pooling

To disable connection pooling, set the Pooling attribute to false. The
default is true. You can enable or disable connection pooling in one of
the following ways:

* Enter a Pooling value in the Edit Connection Pool Advanced Attributes
page in the Administration Console. For more information, click the Help
button in the Administration Console.
* Specify the `--pooling` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `pooling` option in the `asadmin set` command. For
example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.pooling=false
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].

The `pooling` option and the system property
`com.sun.enterprise.connectors.SwitchoffACCConnectionPooling`, which
turns off connection pooling in the Application Client Container, do not
affect each other.

An exception is thrown if `associate-with-thread` is set to `true` and
pooling is disabled. An exception is thrown if you attempt to flush a
connection pool when pooling is disabled. A warning is logged if the
following attributes are used, because they are useful only in a pooled
environment:

* `connection-validation`
* `validate-atmost-once-period`
* `match-connections`
* `max-connection-usage`
* `idle-timeout`

[[giydr]][[GSDVG00502]][[associating-connections-with-threads]]

==== Associating Connections with Threads

To associate connections with a thread, set the Associate With Thread
attribute to `true`. The default is `false`. A `true` setting allows
connections to be saved as `ThreadLocal` in the calling thread.
Connections get reclaimed only when the calling thread dies or when the
calling thread is not in use and the pool has run out of connections. If
the setting is `false`, the thread must obtain a connection from the
pool each time the thread requires a connection.

The Associate With Thread attribute associates connections with a thread
such that when the same thread is in need of connections, it can reuse
the connections already associated with that thread. In this case, the
overhead of getting connections from the pool is avoided. However, when
this value is set to `true`, you should verify that the value of the Max
Pool Size attribute is comparable to the Max Thread Pool Size attribute
of the thread pool. If the Max Thread Pool Size value is much higher
than the Max Pool Size value, a lot of time is spent associating
connections with a new thread after dissociating them from an older one.
Use this attribute in cases where the thread pool should reuse
connections to avoid this overhead.

You can set the Associate With Thread attribute in the following ways:

* Enter an Associate With Thread value in the Edit Connection Pool
Advanced Attributes page in the Administration Console. For more
information, click the Help button in the Administration Console.
* Specify the `--associatewiththread` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `associate-with-thread` option in the `asadmin set`
command. For example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.associate-with-thread=true
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].

[[giyfg]][[GSDVG00503]][[custom-connection-validation]]

==== Custom Connection Validation

You can specify a custom implementation for Connection Validation that
is faster or optimized for a specific database. Set the Validation
Method attribute to the value `custom-validation`. (Other validation
methods available are `table` (the default), `auto-commit`, and
`meta-data`.) The {productName} provides a public interface,
org.glassfish.api.jdbc.ConnectionValidation, which you can implement to
plug in your implementation. A new attribute, Validation Classname,
specifies the fully qualified name of the class that implements the
ConnectionValidation interface. The Validation Classname attribute is
required if Connection Validation is enabled and Validation Method is
set to Custom Validation.

To enable this feature, set Connection Validation, Validation Method,
and Validation Classname for the JDBC connection pool in one of the
following ways:

* Enter Connection Validation, Validation Method, and Validation
Classname values in the Edit Connection Pool Advanced Attributes page in
the Administration Console. You can select from among validation class
names for common databases in the Validation Classname field. For more
information, click the Help button in the Administration Console.
* Specify the `--isconnectionvalidatereq`, `--validationmethod`, and
`--validationclassname` options in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `is-connection-validation-required`,
`connection-validation-method`, and `validation-classname` options in
the `asadmin set` command. For example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.MyPool.is-connection-validation-required=true
asadmin set domain1.resources.jdbc-connection-pool.MyPool.connection-validation-method=custom-validation
asadmin set domain1.resources.jdbc-connection-pool.MyPool.validation-classname=impl-class
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].

By default, optimized validation mechanisms are provided for DB2, Apache
Derby, MSSQL, MySQL, Oracle, PostgreSQL and Sybase databases.
Additionally, for JDBC 4.0 compliant database drivers, a validation
mechanism is provided that uses the `Connection.isValid(0)`
implementation.

[[beams]][[GSDVG00504]][[sharing-connections]]

==== Sharing Connections

When multiple connections acquired by an application use the same JDBC
resource, the connection pool provides connection sharing within the
same transaction scope. For example, suppose Bean A starts a transaction
and obtains a connection, then calls a method in Bean B. If Bean B
acquires a connection to the same JDBC resource with the same sign-on
information, and if Bean A completes the transaction, the connection can
be shared.

Connections obtained through a resource are shared only if the resource
reference declared by the Jakarta EE component allows it to be shareable.
This is specified in a component's deployment descriptor by setting the
`res-sharing-scope` element to `Shareable` for the particular resource
reference. To turn off connection sharing, set `res-sharing-scope` to
`Unshareable`.

For general information about connections and JDBC URLs, see
"link:administration-guide/jdbc.html#GSADG00015[Administering Database Connectivity]" in {productName} Administration Guide.

[[gezfh]][[GSDVG00505]][[marking-bad-connections]]

==== Marking Bad Connections

The `DataSource` implementation in the {productName} provides a
`markConnectionAsBad` method. A marked bad connection is removed from
its connection pool when it is closed. The method signature is as
follows:

[source,java]
----
public void markConnectionAsBad(java.sql.Connection con)
----

For example:

[source,java]
----
com.sun.appserv.jdbc.DataSource ds=
   (com.sun.appserv.jdbc.DataSource)context.lookup("dataSource");
Connection con = ds.getConnection();
Statement stmt = null;
try{
   stmt = con.createStatement();
   stmt.executeUpdate("Update");
}
catch (BadConnectionException e){
   ds.markConnectionAsBad(con) //marking it as bad for removal
}
finally{
   stmt.close();
   con.close(); //Connection will be destroyed during close.
}
----

[[gipzl]][[GSDVG00506]][[handling-invalid-connections]]

==== Handling Invalid Connections

If a `ConnectionErrorOccured` event occurs, the {productName}
considers the connection invalid and removes the connection from the
connection pool. Typically, a JDBC driver generates a
`ConnectionErrorOccured` event when it finds a `ManagedConnection`
object unusable. Reasons can be database failure, network failure with
the database, fatal problems with the connection pool, and so on.

If the `fail-all-connections` setting in the connection pool
configuration is set to `true`, and a single connection fails, all
connections are closed and recreated. If this setting is `false`,
individual connections are recreated only when they are used. The
default is `false`.

The `is-connection-validation-required` setting specifies whether
connections have to be validated before being given to the application.
If a resource's validation fails, it is destroyed, and a new resource is
created and returned. The default is `false`.

The `prefer-validate-over-recreate` property specifies that validating
idle connections is preferable to closing them. This property has no
effect on non-idle connections. If set to `true`, idle connections are
validated during pool resizing, and only those found to be invalid are
destroyed and recreated. If `false`, all idle connections are destroyed
and recreated during pool resizing. The default is `false`.

You can set the `fail-all-connections`,
`is-connection-validation-required`, and `prefer-validate-over-recreate`
configuration settings during creation of a JDBC connection pool. Or,
you can use the `asadmin set` command to dynamically reconfigure a
setting. For example:

[source]
----
asadmin set server.resources.jdbc-connection-pool.JCPool1.fail-all-connections="true"
asadmin set server.resources.jdbc-connection-pool.JCPool1.is-connection-validation-required="true"
asadmin set server.resources.jdbc-connection-pool.JCPool1.property.prefer-validate-over-recreate="true"
----

For details, see the link:reference-manual.html#GSRFM[{productName}
Reference Manual].

The interface ValidatingManagedConnectionFactory exposes the method
`getInvalidConnections` to allow retrieval of the invalid connections.
The {productName} checks if the JDBC driver implements this
interface, and if it does, invalid connections are removed when the
connection pool is resized.

[[giyde]][[GSDVG00184]][[connection-wrapping]]

=== Connection Wrapping

The following topics are addressed here:

* link:#ghqxi[Wrapping Connections]
* link:#beamt[Obtaining a Physical Connection From a Wrapped Connection]
* link:#ggrum[Using the `Connection.unwrap()` Method]

[[ghqxi]][[GSDVG00507]][[wrapping-connections]]

==== Wrapping Connections

If the Wrap JDBC Objects option is `true` (the default), wrapped JDBC
objects are returned for `Statement`, `PreparedStatement`,
`CallableStatement`, `ResultSet`, and `DatabaseMetaData`.

This option ensures that `Statement.getConnection()` is the same as
`DataSource.getConnection()`. Therefore, this option should be `true`
when both `Statement.getConnection()` and `DataSource.getConnection()`
are done.

You can specify the Wrap JDBC Objects option in the following ways:

* Check or uncheck the Wrap JDBC Objects box on the Edit Connection Pool
Advanced Attributes page in the Administration Console. For more
information, click the Help button in the Administration Console.
* Specify the `--wrapjdbcobjects` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].

[[beamt]][[GSDVG00508]][[obtaining-a-physical-connection-from-a-wrapped-connection]]

==== Obtaining a Physical Connection From a Wrapped Connection

The `DataSource` implementation in the {productName} provides a
`getConnection` method that retrieves the JDBC driver's `SQLConnection`
from the {productName}'s `Connection` wrapper. The method signature
is as follows:

[source,java]
----
public java.sql.Connection getConnection(java.sql.Connection con)
throws java.sql.SQLException
----

For example:

[source,java]
----
InitialContext ctx = new InitialContext();
com.sun.appserv.jdbc.DataSource ds = (com.sun.appserv.jdbc.DataSource)
   ctx.lookup("jdbc/MyBase");
Connection con = ds.getConnection();
Connection drivercon = ds.getConnection(con); //get physical connection from wrapper
// Do db operations.
// Do not close driver connection.
con.close(); // return wrapped connection to pool.
----

[[ggrum]][[GSDVG00509]][[using-the-connection.unwrap-method]]

==== Using the `Connection.unwrap()` Method

Using the `Connection.unwrap()` method on a vendor-provided interface
returns an object or a wrapper object implementing the vendor-provided
interface, which the application can make use of to do vendor-specific
database operations. Use the `Connection.isWrapperFor()` method on a
vendor-provided interface to check whether the connection can provide an
implementation of the vendor-provided interface. Check the JDBC driver
vendor's documentation for information on these interfaces.

[[gavro]][[GSDVG00185]][[allowing-non-component-callers]]

=== Allowing Non-Component Callers

You can allow non-Java-EE components, such as servlet filters, lifecycle
modules, and third party persistence managers, to use this JDBC
connection pool. The returned connection is automatically enlisted with
the transaction context obtained from the transaction manager. Standard
Jakarta EE components can also use such pools. Connections obtained by
non-component callers are not automatically closed at the end of a
transaction by the container. They must be explicitly closed by the
caller.

You can enable non-component callers in the following ways:

* Check the Allow Non Component Callers box on the Edit Connection Pool
Advanced Attributes page in the Administration Console. The default is
`false`. For more information, click the Help button in the
Administration Console.
* Specify the `--allownoncomponentcallers` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `allow-non-component-callers` option in the `asadmin set`
command. For example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.allow-non-component-callers=true
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Create a JDBC resource with a `__pm` suffix.

Accessing a `DataSource` using the `Synchronization.beforeCompletion()`
method requires setting Allow Non Component Callers to `true`. For more
information about the Transaction Synchronization Registry, see
link:transaction-service.html#gaxit[The Transaction Manager, the
Transaction Synchronization Registry, and `UserTransaction`].

[[giydx]][[GSDVG00186]][[using-application-scoped-resources]]

=== Using Application-Scoped Resources

You can define an application-scoped database or other resource for an
enterprise application, web module, EJB module, connector module, or
application client module by supplying a `glassfish-resources.xml`
deployment descriptor file. For details, see
"link:application-deployment-guide/deploying-applications.html#GSDPG00075[Application-Scoped Resources]" in {productName} Application Deployment Guide.

[[geqvg]][[GSDVG00187]][[restrictions-and-optimizations]]

=== Restrictions and Optimizations

This section discusses restrictions and performance optimizations that
affect using the JDBC API.

[[geqvy]][[GSDVG00510]][[disabling-stored-procedure-creation-on-sybase]]

==== Disabling Stored Procedure Creation on Sybase

By default, DataDirect and Oracle JDBC drivers for Sybase databases
create a stored procedure for each parameterized `PreparedStatement`. On
the {productName}, exceptions are thrown when primary key identity
generation is attempted. To disable the creation of these stored
procedures, set the property `PrepareMethod=direct` for the JDBC
connection pool.


