Describe the feature
Description
Add intelligence to the AWS JDBC wrapper to automatically set readOnly=true for transactions that only contain SELECT queries, eliminating the need for explicit annotation with @transactional(readOnly=true) in Spring applications.
Problem Statement
Currently, developers must manually annotate methods with @Transactional(readOnly=true) to optimize read-only transactions.
It has below challenges:
- Creates potential for human error if annotations are forgotten
- Increases code verbosity
- Requires developers to understand the performance implications of read-only transactions
Proposed Solution
Implement a wrapperplugin in the AWS JDBC wrapper that:
- Inspects SQL statements before execution
- Automatically sets readOnly=true for connections when only SELECT statements are detected.
- If this plugin is enabled along with readWriteSplitting, it will automatically redirects the query to reader instances, without explicitly setting
@Transactional(readOnly=true)
- Provides configuration options to enable/disable this feature.
aws.jdbc.autoReadOnly.enabled=true
Scenarios
- As there can be below kinds of queries for interacting with SQL databases
- NATIVE QUERY
- JPA BASED QUERY
Benefits
- Performance optimization: Read-only transactions can be optimized by the database
- Reduced boilerplate: No need for explicit @transactional(readOnly=true) annotations
- Error prevention: Eliminates human error in forgetting to set read-only flag
Sample code snippet for this
`public class AutoReadOnlyConnectionWrapper implements ConnectionPlugin {
private boolean enabled = false;
private static final Pattern SELECT_PATTERN = Pattern.compile("^\sSELECT\s+.", Pattern.CASE_INSENSITIVE);
@Override
public Connection connect(ConnectionPlugin next, ConnectionPluginContext ctx) throws SQLException {
Connection connection = next.connect(ctx);
if (enabled) {
return new ReadOnlyAwareConnection(connection);
}
return connection;
}
private static class ReadOnlyAwareConnection implements Connection {
private final Connection delegate;
private boolean containsWriteOperations = false;
// Implementation that monitors statements and sets readOnly appropriately
@Override
public PreparedStatement prepareStatement(String sql) throws SQLException {
if (!SELECT_PATTERN.matcher(sql).matches()) {
containsWriteOperations = true;
delegate.setReadOnly(false);
} else if (!containsWriteOperations) {
delegate.setReadOnly(true);
}
return delegate.prepareStatement(sql);
}
// Other methods delegated to the underlying connection
}
}`
Use Case
- Performance optimization: Read-only transactions can be optimized by the database
- Reduced boilerplate: No need for explicit @transactional(readOnly=true) annotations
- Error prevention: Eliminates human error in forgetting to set read-only flag
Proposed Solution
Implement a wrapperplugin in the AWS JDBC wrapper that:
- Inspects SQL statements before execution
- Automatically sets readOnly=true for connections when only SELECT statements are detected.
- If this plugin is enabled along with readWriteSplitting, it will automatically redirects the query to reader instances, without explicitly setting
@Transactional(readOnly=true)
- Provides configuration options to enable/disable this feature.
aws.jdbc.autoReadOnly.enabled=true
Other Information
No response
Acknowledgements
The AWS Advanced JDBC Driver version used
2.5.6
JDK version used
17
Operating System and version
WIN11
Describe the feature
Description
Add intelligence to the AWS JDBC wrapper to automatically set readOnly=true for transactions that only contain SELECT queries, eliminating the need for explicit annotation with @transactional(readOnly=true) in Spring applications.
Problem Statement
Currently, developers must manually annotate methods with
@Transactional(readOnly=true)to optimize read-only transactions.It has below challenges:
Proposed Solution
Implement a wrapperplugin in the AWS JDBC wrapper that:
@Transactional(readOnly=true)aws.jdbc.autoReadOnly.enabled=trueScenarios
Benefits
Sample code snippet for this
`public class AutoReadOnlyConnectionWrapper implements ConnectionPlugin {
private boolean enabled = false;
private static final Pattern SELECT_PATTERN = Pattern.compile("^\sSELECT\s+.", Pattern.CASE_INSENSITIVE);
}`
Use Case
Proposed Solution
Implement a wrapperplugin in the AWS JDBC wrapper that:
@Transactional(readOnly=true)aws.jdbc.autoReadOnly.enabled=trueOther Information
No response
Acknowledgements
The AWS Advanced JDBC Driver version used
2.5.6
JDK version used
17
Operating System and version
WIN11