Математика

Физика

Химия

Биология

Техника и    технологии

Expert Oracle JDBC Programming - R. M. MENON 2005 str 689
Expert Oracle JDBC Programming - R. M. MENON 2005 str 689




Contents at a Glance
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
About the Technical Reviewers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii
About the OakTable Network . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
CHAPTER 1 Performance Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
CHAPTER 2 Oracle Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
CHAPTER 3 Introduction to JDBC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
CHAPTER 4 Transactions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
CHAPTER 5 Statement and PreparedStatement. . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
CHAPTER 6 CallableStatement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
CHAPTER 7 Result Sets Explored. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
CHAPTER 8 Oracle Objects: An Objective Analysis . . . . . . . . . . . . . . . . . . . . . . . . . 277
CHAPTER 9 Using Weakly Typed Struct Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
CHAPTER 10 Using Strongly Typed Interfaces with JPublisher . . . . . . . . . . . . . . . 345
CHAPTER 11 Using Oracle Collections and References . . . . . . . . . . . . . . . . . . . . . . 387
CHAPTER 12 Using LOBs and BFILEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
CHAPTER 13 Statement Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
CHAPTER 14 Connection Pooling and Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
CHAPTER 15 Security-Related Issues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
CHAPTER 16 Locking-Related Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
CHAPTER 17 Selected PL/SQL Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
APPENDIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
INDEX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
v

Contents
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
About the Technical Reviewers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii
About the OakTable Network . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
¦CHAPTER 1 Performance Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Setting Up the SQL*Plus Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Setting Up autotrace in SQL*Plus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Effect of Setting echo on in SQL*Plus . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Setting Up the SCOTT/TIGER Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Setting Up the BENCHMARK/BENCHMARK Schema . . . . . . . . . . . . . . . . . . . 7
Performance Tools. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
timed_statistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
sql_trace and tkprof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
runstats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
JDBC Wrapper for runstats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Timing Java Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
A Utility to Pause in a Java Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
¦CHAPTER 2 Oracle Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Selected Oracle Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Database vs. Instance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Schemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Data Blocks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
What Makes Oracle Different? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Oracle’s Locking Mechanism. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Multiversion Read Consistency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Writing Effective Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Use Bind Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Minimize I/O, Undo, and Redo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Understand SQL and PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Get Your Database Schema Design Right . . . . . . . . . . . . . . . . . . . . . . 70 vii
General Guidelines for Writing High-Performance Code. . . . . . . . . . . . . . . 73
Know the Features Offered by Oracle. . . . . . . . . . . . . . . . . . . . . . . . . . 73
Design to Optimize the Most Important Business Functions First. . 74
Incorporate Performance from Day One . . . . . . . . . . . . . . . . . . . . . . . 75
Instrument Your Code Extensively. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Test for Performance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Elapsed Time Is Less Than Half the Story . . . . . . . . . . . . . . . . . . . . . . 76
Beware Universal Truths. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
¦CHAPTER 3 Introduction to JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
What Is JDBC? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
JDBC Driver Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Oracle JDBC Drivers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
JDBC Thin Driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
JDBC OCI Driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
JDBC Server-Side Thin Driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
JDBC Server-Side Internal Driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Choosing the Right Driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Software Requirements and Setup Instructions. . . . . . . . . . . . . . . . . . . . . . 83
JDBC Thin Driver on UNIX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
JDBC Thin Driver on Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
JDBC OCI Driver on UNIX and Windows (10g Only) . . . . . . . . . . . . . . 85
JDBC OCI Driver on UNIX and Windows (9i) . . . . . . . . . . . . . . . . . . . . 86
Overview of JDBC API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Connecting to a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Using DriverManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Using a Data Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
A Complete JDBC Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Potential Errors When Executing Your First Program. . . . . . . . . . . . . . . . . 109
Exception Handling in JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Introducing JDBCUtil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
¦CHAPTER 4 Transactions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
What Is a Transaction? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Committing a Transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Rolling Back a Transaction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Transaction Isolation Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Transaction Isolation Levels in JDBC . . . . . . . . . . . . . . . . . . . . . . . . . 119
viii ¦CONTENTS
Sizing Your Transaction Resources According to Your Business Needs . 124
The Autocommit Feature and Turning It Off . . . . . . . . . . . . . . . . . . . . . . . . 129
Transaction Savepoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Using Savepoints in JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
An Example of Using Savepoints. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
¦CHAPTER 5 Statement and PreparedStatement . . . . . . . . . . . . . . . . . . . . . . . 139
Overview of How Oracle Processes SQL Statements (DML) . . . . . . . . . . 140
JDBC API for Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
The Statement Interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
The PreparedStatement Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Creating a PreparedStatement Object . . . . . . . . . . . . . . . . . . . . . . . . 150
Using Bind Variables with PreparedStatements . . . . . . . . . . . . . . . . 151
Example of Using PreparedStatement to Query Data . . . . . . . . . . . 152
Example of Using PreparedStatement to Modify Data . . . . . . . . . . 157
Using Bind Variables Makes Your Program More Secure . . . . . . . . 160
Nuances of Bind Variable Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Update Batching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Types of Statements Supported
by Oracle’s Batching Implementation . . . . . . . . . . . . . . . . . . . . . . 168
Standard Update Batching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Oracle Update Batching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Mixing Interdependent Statements in a Batch . . . . . . . . . . . . . . . . . 175
Oracle Update Batching vs. Standard Update Batching . . . . . . . . . 179
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
¦CHAPTER 6 CallableStatement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
A Brief Introduction to Stored Procedures and PL/SQL. . . . . . . . . . . . . . . 187
Invoking Stored Procedures from JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Formulating the CallableStatement String. . . . . . . . . . . . . . . . . . . . . 190
Creating a CallableStatement Object . . . . . . . . . . . . . . . . . . . . . . . . . 191
Binding Input (in or in out) Parameters . . . . . . . . . . . . . . . . . . . . . . . 191
Registering Output (out or in out) Parameters . . . . . . . . . . . . . . . . . 193
Executing CallableStatement and Retrieving Results . . . . . . . . . . . 195
Putting It All Together in a Working Example. . . . . . . . . . . . . . . . . . . 195
CallableStatement Common Errors and Resolutions. . . . . . . . . . . . . . . . . 202
Where Should Your SQL Statements Reside, in Java or PL/SQL? . . . . . . 204
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
¦CONTENTS ix
¦CHAPTER 7 Result Sets Explored. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Handling Null Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Prefetching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Setting and Getting Fetch Size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Prefetching Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Performance Impact of Fetch Size . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Scrollability, Positioning, and Sensitivity . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Updatability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Creating Different Categories of Result Sets . . . . . . . . . . . . . . . . . . . . . . . 232
Result Set Limitations and Downgrade Rules . . . . . . . . . . . . . . . . . . . . . . 233
Result Set Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Result Set Downgrade Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Positioning in a Scrollable Result Set. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Methods to Move Within a Result Set. . . . . . . . . . . . . . . . . . . . . . . . . 236
Methods to Check Current Position Within a Result Set . . . . . . . . . 237
Example of Positioning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Updating, Inserting, and Deleting Result Set Rows . . . . . . . . . . . . . . . . . . 241
Deleting a Row. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Updating a Row . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Inserting a Row . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Example of Updatability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Lost Updates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Refetching Rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Example of Refetching Rows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Refetching and Scroll-Sensitive Result Sets . . . . . . . . . . . . . . . . . . . 249
Database Changes Visible to a Result Set. . . . . . . . . . . . . . . . . . . . . . . . . . 251
A Result Set’s Ability to Detect Database Changes . . . . . . . . . . . . . . . . . . 252
Paginating Through a Result Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Dynamically Building a Query with an
Unknown Number of Bind Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
PreparedStatement-Based Solution . . . . . . . . . . . . . . . . . . . . . . . . . . 260
CallableStatement-Based Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
ResultSetMetaData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
DatabaseMetaData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
x ¦CONTENTS
¦CHAPTER 8 Oracle Objects: An Objective Analysis . . . . . . . . . . . . . . . . . . . . 277
Introducing Oracle Objects and Collections . . . . . . . . . . . . . . . . . . . . . . . . 278
Object Type (Equivalent of a Java Class) . . . . . . . . . . . . . . . . . . . . . . 278
Declaring and Using Object Variables in PL/SQL . . . . . . . . . . . . . . . 282
Collections (Nested Tables and Varrays) . . . . . . . . . . . . . . . . . . . . . . 283
Using Objects As Programming Constructs . . . . . . . . . . . . . . . . . . . . . . . . 287
Using the Object-Oriented Features of Oracle Objects . . . . . . . . . . 287
Using Objects to Store Data (Not Recommended). . . . . . . . . . . . . . . . . . . 289
Using Varrays to Store Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Using Nested Tables to Store Data . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Storage Considerations for Nested Table Columns . . . . . . . . . . . . . 298
Why It Is Not Recommended to Use Objects to Store Data . . . . . . 300
Using Object Views on Top of Relational Tables . . . . . . . . . . . . . . . . . . . . . 301
Defining an Object Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Defining an Object View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Performing Queries on the Object View . . . . . . . . . . . . . . . . . . . . . . . 303
Defining instead of Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Object Views vs. Nested Tables vs. Relational Tables . . . . . . . . . . . . . . . . 313
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
¦CHAPTER 9 Using Weakly Typed Struct Objects. . . . . . . . . . . . . . . . . . . . . . . 323
Weakly Typed Struct Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
The Struct Interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
The oracle.sql.STRUCT Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Performing DML Operations Using Struct Objects. . . . . . . . . . . . . . . . . . . 327
Creating the Example Database Schema . . . . . . . . . . . . . . . . . . . . . 327
Using the Struct Interface to Select Oracle Objects. . . . . . . . . . . . . 330
Using the oracle.sql.STRUCT Class to Insert Oracle Objects . . . . . 335
Using the oracle.sql.STRUCT Class to Update Oracle Objects . . . . 338
Deleting Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
¦CHAPTER 10 Using Strongly Typed Interfaces with JPublisher. . . . . . . . 345
Strongly Typed Interfaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
An Introduction to JPublisher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Setting Up the JPublisher Environment . . . . . . . . . . . . . . . . . . . . . . . 347
JPublisher Commonly Used Options. . . . . . . . . . . . . . . . . . . . . . . . . . 347
JPublisher Property File Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
JPublisher Input File Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
¦CONTENTS xi
Using the SQLData Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Generating Custom Classes That Implement SQLData . . . . . . . . . . 352
Manually Adding a Method to a Generated Class. . . . . . . . . . . . . . . 358
Using a Type Map to Map Object Types to Java Classes . . . . . . . . 360
Performing DML Using Custom SQLData Classes . . . . . . . . . . . . . . 361
Generating Wrapper Method(s) Automatically . . . . . . . . . . . . . . . . . 366
Using the ORAData and ORADataFactory Interfaces . . . . . . . . . . . . . . . . . 371
Generating Custom Classes that Implement the
ORAData and ORADataFactory Interfaces . . . . . . . . . . . . . . . . . . 372
SQLData vs. ORAData and ORADataFactory. . . . . . . . . . . . . . . . . . . . . . . . 384
A Note on Separating Domain Objects
from the Persistence Mechanism. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
¦CHAPTER 11 Using Oracle Collections and References . . . . . . . . . . . . . . . . 387
Weakly Typed Collection Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
The java.sql.Array Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
The oracle.sql.ARRAY Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
Strongly Typed Collection Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Materializing Collections of Built-in Types As Weakly Typed Objects . . . 390
Creating the Schema for Collections of Built-in Types . . . . . . . . . . 390
Manifesting Collections of Built-in Types As ARRAY Objects . . . . . 392
Materializing Collections of Object Types . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Creating a Schema for a Collection of Object Types . . . . . . . . . . . . 407
Accessing a Collection of Oracle Objects As STRUCT Objects. . . . 409
Accessing a Collection of Oracle Objects Using Custom Classes . . 411
ARRAY Class Performance Extensions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
ARRAY Automatic Element Buffering . . . . . . . . . . . . . . . . . . . . . . . . . 422
ARRAY Automatic Indexing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Benchmarking Auto-buffering and Auto-indexing . . . . . . . . . . . . . . 423
References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
A Brief Introduction to References . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Using References in JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Using Strongly Typed Custom Classes to Query References . . . . . 439
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
xii ¦CONTENTS
¦CHAPTER 12 Using LOBs and BFILEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
What Are LOBs?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
LOBs vs. LONGs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Types of LOBs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
LOB Locator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
Internal LOBs (CLOBs, NCLOBs, and BLOBs) . . . . . . . . . . . . . . . . . . . . . . . 449
Using Internal LOBs in SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Using Internal LOBs in PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
External LOBs (BFILEs) in SQL and PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . 457
Using LOBs in JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
Reading from and Writing to a CLOB . . . . . . . . . . . . . . . . . . . . . . . . . 460
Reading from and Writing to a BLOB . . . . . . . . . . . . . . . . . . . . . . . . . 468
Reading BFILE Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Alternatives to BFILEs for File Operations . . . . . . . . . . . . . . . . . . . . . . . . . 480
Using the UTL_FILE PL/SQL Package to
Read from and Write to a Text File. . . . . . . . . . . . . . . . . . . . . . . . . 480
Using the UTL_FILE PL/SQL Package to
Read from and Write to a Binary File . . . . . . . . . . . . . . . . . . . . . . 483
Using External Tables to Read Text Files . . . . . . . . . . . . . . . . . . . . . . 485
BFILE vs. UTL_FILE vs. External Table . . . . . . . . . . . . . . . . . . . . . . . . 486
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
¦CHAPTER 13 Statement Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
Cursors in PL/SQL (Explicit and Implicit) . . . . . . . . . . . . . . . . . . . . . . 495
Ref Cursors (or Cursor Variables) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Prepare Once, Bind and Execute Many Times . . . . . . . . . . . . . . . . . . . . . . 500
Session Cursor Cache and “Softer” Soft Parses . . . . . . . . . . . . . . . . . . . . 504
Session Cursor Cache in Action. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
PL/SQL Cursor Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Statement Caching in JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511
Statement Caching Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . 511
Implicit and Explicit Statement Caching . . . . . . . . . . . . . . . . . . . . . . 512
Session Cursor Cache vs. PL/SQL Cursor Cache
vs. JDBC Statement Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
¦CONTENTS xiii
¦CHAPTER 14 Connection Pooling and Caching . . . . . . . . . . . . . . . . . . . . . . . . . 529
Connections and Sessions in Oracle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
Client/Server Applications and Connections. . . . . . . . . . . . . . . . . . . . . . . . 531
Web Applications and Connection-Related Challenges . . . . . . . . . . . . . . 532
Cost of Opening and Closing a Connection. . . . . . . . . . . . . . . . . . . . . . . . . 532
What Is Connection Pooling?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
What Is Connection Caching? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Oracle9i Connection Pooling Framework . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Related JDBC Standard and Oracle Interfaces . . . . . . . . . . . . . . . . . 536
Example of Creating a Pooled Connection
and Obtaining a Logical Connection . . . . . . . . . . . . . . . . . . . . . . . 538
Oracle9i Connection Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
Oracle’s Implementation of Connection Cache. . . . . . . . . . . . . . . . . 541
Steps in Using OracleConnectionCacheImpl . . . . . . . . . . . . . . . . . . . 542
Example of Using OracleConnectionCacheImpl . . . . . . . . . . . . . . . . 544
Oracle 10g Implicit Connection Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Using the Oracle 10g Implicit Connection Cache . . . . . . . . . . . . . . . 547
An Example of Using Implicit Connection Caching. . . . . . . . . . . . . . 551
The OracleConnectionCacheManager Class . . . . . . . . . . . . . . . . . . . 554
Using Connection Attributes and Attribute Weights (10g Only) . . . 558
OCI Connection Pooling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
Creating an OCI Connection Pool . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
Configuring the OCI Connection Pool Properties . . . . . . . . . . . . . . . 561
Retrieving a Connection from the OCI Connection Pool . . . . . . . . . 563
Analyzing Connections and Sessions When
OCI Connection Pooling Is in Use. . . . . . . . . . . . . . . . . . . . . . . . . . 563
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
¦CHAPTER 15 Security-Related Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
The Principle of Least Privilege and Defense in Depth . . . . . . . . . . . . . . . 575
Mapping an End User to a Database User . . . . . . . . . . . . . . . . . . . . . . . . . 576
Separating the End User Database Schema, Data Schema,
and Data Access Layer Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
An Example Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Creating the Database Schemas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Creating the Application Data Tables . . . . . . . . . . . . . . . . . . . . . . . . . 581
Granting DML Privileges to db_data_access_layer. . . . . . . . . . . . . 582
Creating the PL/SQL Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Creating Database Roles and Schema for End Users . . . . . . . . . . . 585
xiv ¦CONTENTS
Authenticating an Application End User to the Database . . . . . . . . . . . . . 587
Authentication Using the End User’s Database Password . . . . . . . 588
Proxy Authentication (N-Tier Authentication) . . . . . . . . . . . . . . . . . . 589
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598
¦CHAPTER 16 Locking-Related Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Locking in Oracle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Lost Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Setting the Transaction Isolation Level to SERIALIZABLE . . . . . . . . 603
Pessimistic Locking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
Optimistic Locking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Pessimistic Locking vs. Optimistic Locking. . . . . . . . . . . . . . . . . . . . 627
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
¦CHAPTER 17 Selected PL/SQL Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Further Motivation for Using PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
PL/SQL Is Close to Your Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
PL/SQL Is Portable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
PL/SQL Code Is Compact (Fewer Lines of Code) . . . . . . . . . . . . . . . 630
Tuning SQL in PL/SQL Is Easier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
Adding Code to PL/SQL Is Easier . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
PL/SQL Code May Result in Fewer Round-trips . . . . . . . . . . . . . . . . 631
Common Mistakes When Using PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
Using PL/SQL When a SQL Solution Exists . . . . . . . . . . . . . . . . . . . . 631
Reinventing the Wheel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Selected PL/SQL Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Packaging Matters! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Using Bulk Operations to Boost Performance. . . . . . . . . . . . . . . . . . 640
Preferring Static SQL over Dynamic SQL. . . . . . . . . . . . . . . . . . . . . . 651
Returning Data via a Ref Cursor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
Understanding the Invoker Rights and Definer Rights Modes . . . . 653
PL/SQL Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
Seamless Instrumentation of PL/SQL and JDBC Code . . . . . . . . . . 668
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
¦APPENDIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689

Цена: 200руб.

Назад

Заказ

На главную страницу