Documente Academic
Documente Profesional
Documente Cultură
New Features
Web Version
1
Agenda
Introduction
Pluggable Database
Partial Indexes
Online Data File Move
Online Partition Move
Index Columns
Invisible Columns
Identity Clause
Session Sequences
Global Temporary Table Undo
Temporal Validity
Extended Columns
Row Limiting Clause
Histograms
Application Continuity
Introduction
This presentation investigates a selection of Oracle 12c new features that
I believe will be interesting to DBAs
The presentation was originally delivered at the UKOUG Conference 2013
in Manchester, England
I have added section headers containing comments and feedback from
delegates
In past releases there have been compatibility issues between new features
Occasionally bugs....
New Features
Product Managers and Pre Sales are usually a better source of information
Pluggable Database
Other presenters will have discussed pluggable databases in more detail
The concept was announced in September 2012 and I now believe it is
time to consider how and where it is appropriate to deploy pluggable
databases
My example of a possible deployment was a container database with a
large number of pluggable databases replacing SYBASE. I know that
SYBASE replacement has been a goal at a few of the larger banks for
many years.
Something I missed is that pluggable databases can be cloned allowing
test databases to be created rapidly from production databases.
I have not investigated this feature yet, so have limited my comments to
technical questions I would still like to answer
Pluggable Database
Pluggable Database
Pluggable Database
Data Guard
Single configuration for container database
Pluggable databases share redo thread
May become difficult to manage if standby databases need to be rebuilt
Single large SGA may increase size of kernel page tables area for each
process (foreground / background or both)
Will offset some of the savings in background process memory
New In-Memory database may have same problem
Partial Indexes
I believe this is one of the best features in Oracle 12c for sites using the
Partitioning Option
Most sites partition their tables based on time e.g. year, month, week, day
etc. Most activity centres around the latest (hot) partitions where indexes
are often required to optimize access paths. However, the cost of creating
an index for the entire table often prevents creation of appropriate indexes
as, in current versions, the index needs to be created for all partitions,
requiring additional storage and increasing backup and restore times.
Partial indexes will not reduce redo generation, but could significantly
reduce overall database sizes as they will often affect the largest tables
I think the current implementation is limited, but I still think this is a great
feature
10
Partial Indexes
11
Functionality is limited
For a specific table, only one set of table partitions can be enabled for
index partitions
Partial Indexes
12
If a table partition has INDEXING ON then all rows in that partition will be
indexed in each partial index
Partial Indexes
13
Partial Indexes
14
COUNT(*)
368
338
456
456
480
Partial Indexes
15
NUM_ROWS
0
0
0
456
480
2013 - Julian Dyke
Partial Indexes
16
Partial Indexes
-- Unindexed
SELECT STATEMENT
SORT AGGREGATE
PARTITION RANGE SINGLE
TABLE ACCESS FULL (PCAR)
17
Cost = 14
Partial Indexes
-- Indexed
SELECT STATEMENT
SORT AGGREGATE
PARTITION RANGE SINGLE
INDEX FAST FULL SCAN (PCAR3)
18
Cost = 2
Partial Indexes
-- Combined
SELECT STATEMENT
SORT AGGREGATE
PARTITION RANGE INLIST
TABLE ACCESS FULL (PCAR)
19
Cost = 27
20
In Oracle 12.1 and above any data file can be moved online
For example:
21
The database can be open and accessing the data file while the move is in
progress
22
23
25
Index Columns
This is a useful new feature that allows multiple indexes to be created
with the same column list
For any given column list, only one index can be visible at a time.
However, this enhancement will allow new indexes to be created invisibly
and then made visible at an appropriate time.
26
Index Columns
27
Index Columns
Index Columns
29
Invisible Columns
I strongly believe this is a very dangerous feature. Whilst it achieves its
objectives, it is open to both accidental and malicious misuse as shown in
the example.
Misuse of this feature could introduce data corruptions that may go
unnoticed for months or years and prove to be extremely difficult to
resolve
30
Invisible Columns
NUMBER,
NUMBER,
VARCHAR2(4),
VARCHAR2(3),
NUMBER,
NUMBER,
NUMBER
DESCRIBE icar
Name
SEASON_KEY
RACE_KEY
DRIVER_KEY
TEAM_KEY
POSITION
LAPS_COMPLETED
RACE_POINTS
31
Null?
Type
NUMBER
NUMBER
VARCHAR2(4)
VARCHAR2(3)
NUMBER
NUMBER
NUMBER
Invisible Columns
In the data dictionary COL$ contains the following rows for the ICAR table
SELECT c.name,c.type#,c.col#,c.intcol#,c.segcol#,
TO_CHAR (c.property,'XXXXXXXXXXXX') AS property
FROM sys.col$ c, sys.obj$ o, sys.user$ u
WHERE c.obj# = o.obj#
AND o.owner# = u.user#
AND u.name = 'GP
AND o.name = 'ICAR';
NAME
SEASON_KEY
RACE_KEY
DRIVER_KEY
TEAM_KEY
POSITION
LAPS_COMPLETED
RACE_POINTS
32
TYPE#
2
2
1
1
2
2
2
1
2
3
4
5
6
7
1
2
3
4
5
6
7
PROPERTY
0
0
0
0
0
0
0
Invisible Columns
33
Null?
Type
NUMBER
NUMBER
VARCHAR2(4)
VARCHAR2(3)
NUMBER
NUMBER
Invisible Columns
In the data dictionary COL$ now contains the following rows for ICAR:
SELECT c.name,c.type#,c.col#,c.intcol#,c.segcol#,
TO_CHAR (c.property,'XXXXXXXXXXXX') AS property
FROM sys.col$ c, sys.obj$ o, sys.user$ u
WHERE c.obj# = o.obj#
AND o.owner# = u.user#
AND u.name = 'GP
AND o.name = 'ICAR';
NAME
SEASON_KEY
RACE_KEY
DRIVER_KEY
TEAM_KEY
POSITION
LAPS_COMPLETED
RACE_POINTS
34
TYPE#
2
2
1
1
2
2
2
1
2
3
4
5
6
7
1
2
3
4
5
6
7
PROPERTY
0
0
0
0
0
400000020
0
Invisible Columns
35
Null?
Type
NUMBER
NUMBER
VARCHAR2(4)
VARCHAR2(3)
NUMBER
NUMBER
NUMBER
Invisible Columns
In the data dictionary COL$ now contains the following rows for ICAR:
SELECT c.name,c.type#,c.col#,c.intcol#,c.segcol#,
TO_CHAR (c.property,'XXXXXXXXXXXX') AS property
FROM sys.col$ c, sys.obj$ o, sys.user$ u
WHERE c.obj# = o.obj#
AND o.owner# = u.user#
AND u.name = 'GP
AND o.name = 'ICAR';
NAME
SEASON_KEY
RACE_KEY
DRIVER_KEY
TEAM_KEY
POSITION
LAPS_COMPLETED
RACE_POINTS
36
TYPE#
2
2
1
1
2
2
2
1
2
3
4
5
7
6
1
2
3
4
5
6
7
1
2
3
4
5
6
7
PROPERTY
0
0
0
0
0
0
0
Invisible Columns
SEASON_KEY
2013
KRAI
POSITION
LAPS_COMPLETED
RACE_POINTS
58
25
LOT
37
KRAI
FALO
POSITION
RACE_POINTS
LAPS_COMPLETED
1
2
25
58
58
18
LOT
FER
Invisible Columns
Continued...
ALTER TABLE icar MODIFY race_points INVISIBLE;
ALTER TABLE icar MODIFY race_points VISIBLE;
INSERT INTO icar VALUES (2013,1,SVET',RBR',3,58,15);
SELECT * FROM icar;
SEASON_KEY
2013
2013
2013
38
KRAI
FALO
SVET
POSITION
LAPS_COMPLETED
RACE_POINTS
1
2
3
58
18
58
25
58
15
LOT
FER
RBR
Identity Clause
This new feature simplifies management of sequences used as primary
keys for tables. The identity clause allows an implicit index to be created
for the specified column.
If the table is truncated, the sequence is unaffected
If the table is dropped and recreated the sequence will dropped and
recreated and will restart at the minimum value for the next insertion
39
Identity Clause
In Oracle 12.1 and above an identity clause can be used to specify a sequence
column in CREATE TABLE and ALTER TABLE statements
Syntax is:
GENERATED
[ ALWAYS | BY DEFAULT [ ON NULL ] ]
AS IDENTITY [ ( identity_options ) ]
40
Identity Clause
Example:
CREATE TABLE driver2
(
driver_key NUMBER GENERATED AS IDENTITY,
driver_name VARCHAR2(30),
driver_dob DATE,
country_key VARCHAR2(3)
);
INSERT INTO driver2 (driver_name,driver_dob,country_key)
VALUES ('Sebastian Vettel','03-JUL-1987','GER');
INSERT INTO driver2 (driver_name,driver_dob,country_key)
VALUES ('Fernando Alonso',29-JUL-1981','SPA');
INSERT INTO driver2 (driver_name,driver_dob,country_key)
VALUES ('Kimi Raikkonen','17-OCT-1979','FIN');
SELECT * FROM driver2;
DRIVER_KEY
1
2
3
41
DRIVER_NAME DRIVER_DOB
Sebastian Vettel 03-JUL-1987
Fernando Alonso 29-JUL-1981
Kimi Raikkonen 17-OCT-1979
COUNTRY_KEY
GER
SPA
FIN
Identity Clause
42
Name
Null?
Type
DRIVER_KEY
DRIVER_NAME
DRIVER_DOB
COUNTRY_KEY
NOT NULL
NUMBER
VARCHAR2(30)
DATE
VARCHAR2(3)
Identity Clause
TYPE#
DRIVER_KEY
DRIVER_NAME
DRIVER_DOB
COUNTRY_KEY
43
2
1
12
1
COL#
INTCOL#
SEGCOL#
PROPERTY
1
2
3
4
1
2
3
4
1
2
3
4
2800000000
0
0
0
Identity Clause
SELECT data_default
FROM dba_tab_columns
WHERE owner = 'GP
AND table_name = 'DRIVER2
AND column_name = 'DRIVER_KEY';
"GP"."ISEQ$$_92584".nextval
SELECT
sequence_owner AS owner,min_value,max_value,increment_by,
cycle_flag,order_flag,cache_size
FROM dba_sequences
WHERE sequence_name = 'ISEQ$$_92584';
OWNER
GP
44
MIN_VALUE
1
MAX_VALUE INCREMENT_BY
1.0000E+28
2013 - Julian Dyke
C O CACHE_SIZE
N N
20
Session Sequences
This new feature allows sequences to be created that exist for the lifetime
of the current session only.
Intended for use with global temporary tables, but possibly useful in other
places and more flexible than the ROWNUM pseudo column
45
Session Sequences
For example:
CREATE SEQUENCE seq1 SESSION;
SQL> CONNECT gp/gp
SQL> SELECT seq1.NEXTVAL FROM dual;
NEXTVAL
1
SQL> SELECT seq1.NEXTVAL FROM dual;
NEXTVAL
2
SQL> CONNECT gp/gp
SQL> SELECT seq1.NEXTVAL FROM dual;
NEXTVAL
1
46
Global Temporary
Table Undo
This new feature allows undo for global temporary tables to be written to
the temporary table space
It will not have much impact for insertions, but could have a significant
impact on redo generation caused by GTT undo during updates
I envisage this becoming the default in future versions
47
48
Temporal Validity
Temporal validity allows tables to be created where rows are valid for a
specific period of time
A major defect is that is not possible to create primary keys with temporal
validity. This functionality may be added in a future release, until which
time this feature may be of limited use.
49
Temporal Validity
50
Temporal Validity
For example:
51
Temporal Validity
For example:
TEAM_KEY
FER
FER
FER
FER
FER
JOINING_DATE
01-JAN-2010
01-JAN-2006
01-JAN-2007
01-JAN-2000
01-JAN-1996
LEAVING_DATE
31-DEC-2013
31-DEC-2009
31-DEC-2007
31-DEC-2006
Who was in the team for the 2009 British Grand Prix qualifying?
52
TEAM_KEY
FER
FER
JOINING_DATE
01-JAN-2006
01-JAN-2007
LEAVING_DATE
31-DEC-2013
31-DEC-2009
Temporal Validity
53
Null?
Type
VARCHAR2(4)
VARCHAR2(3)
DATE
DATE
Temporal Validity
NAME
COL# INTCOL# SEGCOL#
TEAM_MEMBER_VALID_TIME
0
1
0
DRIVER_KEY
1
2
1
TEAM_KEY
2
3
2
JOINING_DATE
3
4
3
LEAVING_DATE
4
5
4
54
TYPE#
2
1
1
12
12
PROPERTY
10028
0
0
0
0
Extended Columns
This feature allows the size of VARCHAR2, NVARCHAR2 and RAW
columns stored in the database to be increased to 32767 bytes. If the
value is longer than 4000 bytes it is stored as an out of line LOB
Built-in functions appear to work correctly with the longer column sizes
This feature needs to be enabled by setting MAX_STRING_SIZE to
EXTENDED. This parameter is not set by default. You may want to set this
parameter before creating a database, otherwise you will need an outage
as the parameter must be set when the database is in UPGRADE mode
55
Extended Columns
56
Oracle 11.2
and below
Oracle 12.1
and above
VARCHAR2
4000
32767
NVARCHAR2
2000
16383
RAW
2000
32767
Maximum length of CHAR and NCHAR remains at 2000 and 1000 respectively
Extended Columns
57
Extended Columns
58
Extended Columns
NUMBER,
NUMBER,
VARCHAR2(4),
VARCHAR2(3),
NUMBER,
NUMBER,
VARCHAR2(32767),
NUMBER
59
Extended Columns
COLUMN_NAME
SEGMENT_NAME
SECUREFILE
NOTES
SYS_LOB0000092626C00007$$
YES
60
COLUMN_NAME
INDEX_NAME
NOTES
SYS_IL0000092626C00007$$
2013 - Julian Dyke
61
In Oracle 12c and above SELECT statements can include the FETCH FIRST
clause
Limits rows returned by query
Optional replacement syntax for TOP-N queries
Syntax is:
[ OFFSET offset { ROW | ROWS } ]
[ FETCH { FIRST | NEXT } [ { rowcount | percent PERCENT } ]
{ ROW | ROWS } { ONLY | WITH TIES } ]
62
63
Restrictions
Cannot be specified in SELECT FOR UPDATE statements
Cannot be used with CURRVAL or NEXTVAL pseudo-columns
Cannot be used with materialized view incremental refresh
64
Points
281
278
207
190
188
179
122
96
93
66
SELECT * FROM
(
SELECT d.driver_name,t.team_name,SUM(c.driver_points)
FROM car c,driver d,team t
WHERE c.season_key = 2012
AND c.driver_key = d.driver_key
AND c.team_key = t.team_key
GROUP BY d.driver_name,t.team_name
ORDER BY SUM(c.driver_points) DESC
)
WHERE ROWNUM <= 5;
Driver Name
Points
Sebastian Vettel
281
Fernando Alonso
278
Kimi Raikkonen
----------------------------------------------------------------------207
| Id | Operation
| Name
| Rows |Lewis
Bytes
| Cost (%CPU)|
Hamilton
----------------------------------------------------------------------|
0 | SELECT STATEMENT
|
|
5 |190 335 |
41
(0)|
|* 1 | COUNT STOPKEY
|
|
|Jenson Button
|
|
|
2 |
VIEW
|
|
480 | 32160 |
41
(0)|
|* 3 |
SORT ORDER BY STOPKEY|
|
480 |188
23520 |
41
(0)|
|
4 |
HASH GROUP BY
|
|
480 | 23520 |
41
(0)|
|* 5 |
HASH JOIN
|
|
480 | 23520 |
41
(0)|
|
6 |
TABLE ACCESS FULL | TEAM
|
104 | 1248 |
2
(0)|
|* 7 |
HASH JOIN
|
|
480 | 17760 |
39
(0)|
|* 8 |
TABLE ACCESS FULL| CAR
|
480 | 8160 |
36
(0)|
|
9 |
TABLE ACCESS FULL| DRIVER |
493 | 9860 |
3
(0)|
-----------------------------------------------------------------------
65
Driver Name
Points
Sebastian Vettel
281
Fernando Alonso
278
Kimi Raikkonen
------------------------------------------------------------------------| Id | Operation
| Name
| Rows | Bytes | Cost (%CPU)|
207
------------------------------------------------------------------------Lewis Hamilton
|
0 | SELECT STATEMENT
|
|
480 | 44640 |
41
(0)|
|
1 | SORT ORDER BY
|
|
480 | 44640 |
41
(0)|
190
|* 2 |
VIEW
|
|
480 | 44640 |
41
(0)|
Jenson Button
|* 3 |
WINDOW SORT PUSHED RANK|
|
480 | 23520 |
41
(0)|
|
4 |
HASH GROUP BY
|
|
480 | 23520 |
41
(0)|
|* 5 |
HASH JOIN
|
|
480 188
| 23520 |
41
(0)|
|
6 |
TABLE ACCESS FULL
| TEAM
|
104 | 1248 |
2
(0)|
|* 7 |
HASH JOIN
|
|
480 | 17760 |
39
(0)|
|* 8 |
TABLE ACCESS FULL | CAR
|
480 | 8160 |
36
(0)|
|
9 |
TABLE ACCESS FULL | DRIVER |
493 | 9860 |
3
(0)|
-------------------------------------------------------------------------
66
SELECT d.driver_name,t.team_name,SUM(c.driver_points)
FROM car c,driver d,team t
WHERE c.season_key = 2012
AND c.driver_key = d.driver_key
AND c.team_key = t.team_key
GROUP BY d.driver_name,t.team_name
ORDER BY SUM(c.driver_points) DESC
FETCH FIRST 20 PERCENT ROWS WITH TIES;
Driver Name
Points
Sebastian Vettel
281
Fernando Alonso
278
Kimi Raikkonen
----------------------------------------------------------------------| Id | Operation
| Name
| Rows | Bytes | Cost (%CPU)|
207
----------------------------------------------------------------------Lewis Hamilton
|
0 | SELECT STATEMENT
|
|
480 | 50880 |
41
(0)|
|
1 | SORT ORDER BY
|
|
480 | 50880 |
41
(0)|
190
|* 2 |
VIEW
|
|
480 | 50880 |
41
(0)|
Jenson Button
|
3 |
WINDOW SORT
|
|
480 | 23520 |
41
(0)|
|
4 |
HASH GROUP BY
|
|
480 | 23520 |
41
(0)|
|* 5 |
HASH JOIN
|
|
480 | 188
23520 |
41
(0)|
|
6 |
TABLE ACCESS FULL | TEAM
|
104 | 1248 |
2
(0)|
|* 7 |
HASH JOIN
|
|
480 | 17760 |
39
(0)|
|* 8 |
TABLE ACCESS FULL| CAR
|
480 | 8160 |
36
(0)|
|
9 |
TABLE ACCESS FULL| DRIVER |
493 | 9860 |
3
(0)|
-----------------------------------------------------------------------
67
Driver Name
Points
Mark Webber
179
Felipe Massa
122
Romain Grosjean
------------------------------------------------------------------------| Id | Operation
| Name
| Rows | Bytes | Cost (%CPU)|
96
------------------------------------------------------------------------Nico Rosberg
|
0 | SELECT STATEMENT
|
|
480 | 44640 |
41
(0)|
|
1 | SORT ORDER BY
|
|
480 | 44640 |
41
(0)|
93
|* 2 |
VIEW
|
|
480 | 44640 |
41
(0)|
Sergio Perez
|* 3 |
WINDOW SORT PUSHED RANK|
|
480 | 23520 |
41
(0)|
|
4 |
HASH GROUP BY
|
|
480 | 23520 |
41
(0)|
|* 5 |
HASH JOIN
|
|
480 66
| 23520 |
41
(0)|
|
6 |
TABLE ACCESS FULL
| TEAM
|
104 | 1248 |
2
(0)|
|* 7 |
HASH JOIN
|
|
480 | 17760 |
39
(0)|
|* 8 |
TABLE ACCESS FULL | CAR
|
480 | 8160 |
36
(0)|
|
9 |
TABLE ACCESS FULL | DRIVER |
493 | 9860 |
3
(0)|
-------------------------------------------------------------------------
68
Histograms
There are several enhancements to histograms in Oracle 12c. This section
concentrates on the increase in maximum number of buckets from 254 to
2048. Increasing the number of buckets allows better cardinalities to be
estimated by the optimization, potentially generating more efficient
execution plans
The increased bucket sizes work for both single column and multi column
statistics
This is particular useful with my Formula 1 database which (for the period
1961 to 2012) contains 492 drivers and 1289 driver/team combinations.
69
Histograms
For example, an inefficient execution plan has been generated for a query
We determine that the root cause is poor cardinality estimates for the
DRIVER_KEY column in the CAR table
70
Histograms
71
Histograms
72
Histograms
If more than 256 buckets are required, this must be specified explicitly:
dbms_stats.gather_table_stats
(
ownname => 'GP',
tabname => 'CAR',
estimate_percent => NULL
method_opt => 'FOR COLUMNS driver_key SIZE 2048'
);
73
Histograms
Multi-Column Statistics
DECLARE
l_extension_name VARCHAR2(30);
BEGIN
l_extension_name := dbms_stats.create_extended_stats
(
ownname => 'GP',
tabname => 'CAR6',
extension => '(driver_key,team_key)
);
END;
BEGIN
dbms_stats.gather_table_stats
(
ownname => 'GP',
tabname => 'CAR6',
estimate_percent => NULL,
method_opt => 'FOR COLUMNS (DRIVER_KEY,TEAM_KEY) SIZE 2048
);
END;
74
Histograms
Multi-Column Statistics
DECLARE
l_extension_name VARCHAR2(30);
BEGIN
l_extension_name := dbms_stats.create_extended_stats
(
ownname => 'GP',
tabname => 'CAR6',
extension => '(driver_key,team_key)
);
END;
BEGIN
dbms_stats.gather_table_stats
(
ownname => 'GP',
tabname => 'CAR6',
estimate_percent => NULL,
method_opt => 'FOR COLUMNS (DRIVER_KEY,TEAM_KEY) SIZE 2048
);
END;
75
Histograms
Multi-Column Statistics
I
d
Operation
SELECT STATEMENT
Name
Rows
Bytes
Cost (%CPU)
39
00:00:0
1
39
00:00:0
1
(0)
1
SORT AGGREGATE
TABLE ACCESS
FULL
776
CAR
181
1629
Correct (0)
Cardinality
Time
Histograms
Multi-Column Statistics
I
d
Operation
SELECT STATEMENT
Name
Rows
Bytes
Cost (%CPU)
39
00:00:0
1
39
00:00:0
1
(0)
1
SORT AGGREGATE
TABLE ACCESS
FULL
777
CAR
1629
Correct (0)
Cardinality
Time
Application Continuity
This is potentially a very important new feature which allows uncommitted
transactions to be replayed in another instance following a RAC or Data
Guard failover or session relocation
I anticipate many sites will wish to take advantage of this new
functionality.
Initially I have attempted to create a simple test example of this
functionality using a JDBC thin client application, but have so far been
unsuccessful.
I know that Trivadis have successful created a demonstration of
Application Continuity using the Universal Connection Pool (UCP) so it
does work.
Further investigation is required for the JDBC Thin example. In the
meantime this session contains the configuration that I have completed
so far.
78
Application Continuity
79
Application Continuity
80
JDBC calls should handle events for the current session such as:
Service shutdown
Instance failure
Network failure
Node failure
Application Continuity
81
Application Continuity
82
Application Continuity
For example:
jdbc:oracle:thin:gp/gp@(DESCRIPTION=(TRANSPORT_CONNECT_TIMEOUT=3)
(CONNECT_TIMEOUT=60)(RETRY_COUNT=10)(FAILOVER=ON)
(ADDRESS=(PROTOCOL=tcp)(PORT=1521)(HOST=vmcluster1-scan.juliandyke.com))
(CONNECT_DATA=(SERVICE_NAME=SERVICE1)))
83
Application Continuity
Configure the Oracle JDBC 12c Replay Data Source in the property file or in
the thin JDBC application e.g.
import oracle.jdbc.replay.OracleDataSourceImpl;
import oracle.jdbc.replay.ReplayableConnection;
OracleDataSourceImpl ods = new OracleDataSourceImpl();
ods.setURL(url);
connection = ods.getConnection();
connection.setAutoCommit (false);
...
((ReplayableConnection)connection).beginRequest();
# Application processing
((ReplayableConnection)connection).endRequest();
84
Application Continuity
oracle.jdbc.internal.replay.level = FINEST
handlers = java.util.logging.FileHandler
java.util.logging.FileHandler.pattern = /home/oracle/12c/appcon2/replay_%U.trc
java.util.logging.FileHandler.limit = 500000000
java.util.logging.FileHandler.count = 1000
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
Execute using:
java -Djava.util.logging.config.file=/home/oracle/appcon/properties J7
85
Application Continuity
86
info@juliandyke.com
87