Re: Commit Exception Error

From: marco turchi (marco.turch..mail.com)
Date: Sun Jan 13 2008 - 05:47:30 EST

  • Next message: marco turchi: "Re: Commit Exception Error"

    I understand, but which are the option in my.cnf that I should change? are
    there any specific entries that I need to enable or disable?
    thanks
    Marco

    On Jan 13, 2008 10:32 AM, Andrus Adamchik <andru..bjectstyle.org> wrote:

    > At this point it is hard to recommend anything specific with no access
    > to your environment... Now that the client side is setup to handle
    > connection timeouts, you may have to start digging on the server side,
    > tweaking appropriate MySQL options (e.g. those in my.cnf).
    >
    > Andrus
    >
    >
    > On Jan 12, 2008, at 10:08 PM, marco turchi wrote:
    >
    > > Hi Andrus,
    > > I have created the new url adding what u have suggested me...
    > > <url
    > > value="jdbc:mysql://enm-nc-srv1/subsumer?
    > > connectTimeout=0&amp;autoReconnect=true"/>
    > > but I get again the same error:
    > > org.objectstyle.cayenne.CayenneRuntimeException: [v.1.2.3 May 6
    > > 2007] Commit
    > > Exception
    > > at org.objectstyle.cayenne.access.DataContext.flushToParent(
    > > DataContext.java:1290)
    > > at org.objectstyle.cayenne.access.DataContext.commitChanges(
    > > DataContext.java:1166)
    > > at com.translation.alg.WriterData.insert(WriterData.java:57)
    > > at com.translation.alg.News.write(News.java:85)
    > > at
    > > com.translation.alg.TranslationNews.run(TranslationNews.java:66)
    > > at
    > > com.translation.alg.TranslationNews.main(TranslationNews.java:21)
    > > Caused by: java.sql.SQLException: Communication link failure:
    > > java.net.SocketException, underlying cause: Broken pipe
    > >
    > > ** BEGIN NESTED EXCEPTION **
    > >
    > > java.net.SocketException
    > > MESSAGE: Broken pipe
    > >
    > > STACKTRACE:
    > >
    > > java.net.SocketException: Broken pipe
    > > at java.net.SocketOutputStream.socketWrite0(Native Method)
    > > at
    > > java.net.SocketOutputStream.socketWrite(SocketOutputStream.java
    > > :92)
    > > at java.net.SocketOutputStream.write(SocketOutputStream.java:
    > > 136)
    > > at java.io.BufferedOutputStream.flushBuffer(
    > > BufferedOutputStream.java:65)
    > > at
    > > java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
    > > at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:1765)
    > > at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:1728)
    > > at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1149)
    > > at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1279)
    > > at com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:1225)
    > > at com.mysql.jdbc.Connection.execSQL(Connection.java:2278)
    > > at com.mysql.jdbc.Connection.execSQL(Connection.java:2225)
    > > at com.mysql.jdbc.Statement.execute(Statement.java:906)
    > > at
    > > org.objectstyle.cayenne.dba.mysql.MySQLPkGenerator.pkFromDatabase
    > > (MySQLPkGenerator.java:123)
    > > at
    > > org.objectstyle.cayenne.dba.JdbcPkGenerator.generatePkForDbEntity
    > > (JdbcPkGenerator.java:326)
    > > at
    > > org
    > > .objectstyle
    > > .cayenne.access.DataDomainInsertBucket.createPermIdsForObjEntity
    > > (DataDomainInsertBucket.java:194)
    > > at
    > > org
    > > .objectstyle
    > > .cayenne.access.DataDomainInsertBucket.appendQueriesInternal(
    > > DataDomainInsertBucket.java:122)
    > > at
    > > org.objectstyle.cayenne.access.DataDomainSyncBucket.appendQueries
    > > (DataDomainSyncBucket.java:108)
    > > at
    > > org.objectstyle.cayenne.access.DataDomainFlushAction.preprocess(
    > > DataDomainFlushAction.java:211)
    > > at org.objectstyle.cayenne.access.DataDomainFlushAction.flush(
    > > DataDomainFlushAction.java:167)
    > > at org.objectstyle.cayenne.access.DataDomain.onSyncFlush(
    > > DataDomain.java:846)
    > > at org.objectstyle.cayenne.access.DataDomain$2.transform(
    > > DataDomain.java:817)
    > > at org.objectstyle.cayenne.access.DataDomain.runInTransaction(
    > > DataDomain.java:862)
    > > at
    > > org.objectstyle.cayenne.access.DataDomain.onSync(DataDomain.java
    > > :814)
    > > at org.objectstyle.cayenne.access.DataContext.flushToParent(
    > > DataContext.java:1262)
    > > at org.objectstyle.cayenne.access.DataContext.commitChanges(
    > > DataContext.java:1166)
    > > at com.translation.alg.WriterData.insert(WriterData.java:57)
    > > at com.translation.alg.News.write(News.java:85)
    > > at
    > > com.translation.alg.TranslationNews.run(TranslationNews.java:66)
    > > at
    > > com.translation.alg.TranslationNews.main(TranslationNews.java:21)
    > >
    > >
    > > ** END NESTED EXCEPTION **
    > >
    > >
    > > at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:1786)
    > > at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:1728)
    > > at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1149)
    > > at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1279)
    > > at com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:1225)
    > > at com.mysql.jdbc.Connection.execSQL(Connection.java:2278)
    > > at com.mysql.jdbc.Connection.execSQL(Connection.java:2225)
    > > at com.mysql.jdbc.Statement.execute(Statement.java:906)
    > > at
    > > org.objectstyle.cayenne.dba.mysql.MySQLPkGenerator.pkFromDatabase
    > > (MySQLPkGenerator.java:123)
    > > at
    > > org.objectstyle.cayenne.dba.JdbcPkGenerator.generatePkForDbEntity
    > > (JdbcPkGenerator.java:326)
    > > at
    > > org
    > > .objectstyle
    > > .cayenne.access.DataDomainInsertBucket.createPermIdsForObjEntity
    > > (DataDomainInsertBucket.java:194)
    > > at
    > > org
    > > .objectstyle
    > > .cayenne.access.DataDomainInsertBucket.appendQueriesInternal(
    > > DataDomainInsertBucket.java:122)
    > > at
    > > org.objectstyle.cayenne.access.DataDomainSyncBucket.appendQueries
    > > (DataDomainSyncBucket.java:108)
    > > at
    > > org.objectstyle.cayenne.access.DataDomainFlushAction.preprocess(
    > > DataDomainFlushAction.java:211)
    > > at org.objectstyle.cayenne.access.DataDomainFlushAction.flush(
    > > DataDomainFlushAction.java:167)
    > > at org.objectstyle.cayenne.access.DataDomain.onSyncFlush(
    > > DataDomain.java:846)
    > > at org.objectstyle.cayenne.access.DataDomain$2.transform(
    > > DataDomain.java:817)
    > > at org.objectstyle.cayenne.access.DataDomain.runInTransaction(
    > > DataDomain.java:862)
    > > at
    > > org.objectstyle.cayenne.access.DataDomain.onSync(DataDomain.java
    > > :814)
    > > at org.objectstyle.cayenne.access.DataContext.flushToParent(
    > > DataContext.java:1262)
    > > ... 5 more
    > > 12 Jan 2008 19:40:25,088 - INFO main
    > > com.translation.alg.TranslationNews - [
    > > Ljava.lang.StackTraceElement..551f60
    > >
    > >
    > > I'm quite desperate!!! :-)
    > > thanks
    > > Marco
    > >
    > > On Jan 11, 2008 10:06 AM, Andrus Adamchik <andru..bjectstyle.org>
    > > wrote:
    > >
    > >> To make it valid XML you will need to replace "&" with "&amp;" (or
    > >> use
    > >> CayenneModeler that will do it for you).
    > >>
    > >> Andrus
    > >>
    > >>
    > >> On Jan 11, 2008, at 12:02 PM, marco turchi wrote:
    > >>
    > >>> I have added the string that u send me,
    > >>>
    > >>> <url
    > >>> value="jdbc:mysql://enm-nc-srv1/subsumer?
    > >>> connectTimeout=0&autoReconnect=true"/>
    > >>>
    > >>>
    > >>> but I get:
    > >>> java.lang.ExceptionInInitializerError
    > >>> at
    > >>> com.translation.alg.TranslationNews.run(TranslationNews.java:33)
    > >>> at
    > >>> com.translation.alg.TranslationNews.main(TranslationNews.java:21)
    > >>> Caused by: org.objectstyle.cayenne.ConfigurationException: [v.1.2.3
    > >>> May 6
    > >>> 2007] Error during Configuration initialization. [v.1.2.3 May 6
    > >>> 2007] Load
    > >>> failures. Main configuration class:
    > >>> org.objectstyle.cayenne.conf.DefaultConfiguration, details:
    > >>> domain.node.name=TranslationNode,
    > >>> domain.node.datasource=TranslationNode.driver.xml, reason:
    > >>> DataSource load
    > >>> failed - The reference to entity "autoReconnect" must end with the
    > >>> ';'
    > >>> delimiter.
    > >>> at
    > >>> org
    > >>> .objectstyle
    > >>> .cayenne.conf.Configuration.initializeSharedConfiguration(
    > >>> Configuration.java:321)
    > >>> at
    > >>> org
    > >>> .objectstyle
    > >>> .cayenne.conf.Configuration.initializeSharedConfiguration(
    > >>> Configuration.java:294)
    > >>> at
    > >>> org
    > >>> .objectstyle
    > >>> .cayenne.conf.Configuration.initializeSharedConfiguration(
    > >>> Configuration.java:275)
    > >>> at
    > >>> org.objectstyle.cayenne.conf.Configuration.getSharedConfiguration
    > >>> (Configuration.java:212)
    > >>> at
    > >>> org.objectstyle.cayenne.access.DataContext.createDataContext(
    > >>> DataContext.java:242)
    > >>> at com.translation.alg.News.<clinit>(News.java:17)
    > >>> ... 2 more
    > >>>
    > >>> I have added ";" at the end of the string, but nothing changes
    > >>> <url
    > >>> value="jdbc:mysql://enm-nc-srv1/subsumer?
    > >>> connectTimeout=0&autoReconnect=true;"/>
    > >>>
    > >>> Thanks
    > >>> Marco
    > >>> On Jan 11, 2008 9:51 AM, marco turchi <marco.turch..mail.com>
    > >>> wrote:
    > >>>
    > >>>> Thanks...I'm going to try...
    > >>>> Marco
    > >>>>
    > >>>>
    > >>>> On Jan 11, 2008 9:39 AM, Andrus Adamchik <andru..bjectstyle.org>
    > >>>> wrote:
    > >>>>
    > >>>>> This is still a connection timeout issue. I dug up some of my own
    > >>>>> production configurations developed to address a similar issue.
    > >>>>> Here
    > >>>>> is another URL parameter you may try - "connectTimeout". E.g.:
    > >>>>>
    > >>>>> jdbc:mysql://server/database?connectTimeout=0&autoReconnect=true
    > >>>>>
    > >>>>> Andrus
    > >>>>>
    > >>>>> On Jan 11, 2008, at 1:36 AM, marco turchi wrote:
    > >>>>>
    > >>>>>> Hi Andrus,
    > >>>>>> no good news...
    > >>>>>> I have run the software using the changes that u have suggested
    > >>>>>> me,
    > >>>>>> but I
    > >>>>>> get:
    > >>>>>> 10 Jan 2008 23:19:30,036 - ERROR main
    > >>>>>> com.translation.alg.TranslationNews -
    > >>>>>> Fatal Error:
    > >>>>>> org.objectstyle.cayenne.CayenneRuntimeException: [v.1.2.3 May 6
    > >>>>>> 2007] Commit
    > >>>>>> Exception
    > >>>>>> at org.objectstyle.cayenne.access.DataContext.flushToParent(
    > >>>>>> DataContext.java :1290)
    > >>>>>> at org.objectstyle.cayenne.access.DataContext.commitChanges(
    > >>>>>> DataContext.java:1166)
    > >>>>>> at com.translation.alg.WriterData.insert(WriterData.java:57)
    > >>>>>> at com.translation.alg.News.write (News.java:85)
    > >>>>>> at
    > >>>>>> com.translation.alg.TranslationNews.run(TranslationNews.java:66)
    > >>>>>> at
    > >>>>>> com.translation.alg.TranslationNews.main(TranslationNews.java:21)
    > >>>>>> Caused by: java.sql.SQLException : Communication link failure:
    > >>>>>> java.net.SocketException, underlying cause: Broken pipe
    > >>>>>>
    > >>>>>> ** BEGIN NESTED EXCEPTION **
    > >>>>>>
    > >>>>>> java.net.SocketException
    > >>>>>> MESSAGE: Broken pipe
    > >>>>>>
    > >>>>>> STACKTRACE:
    > >>>>>>
    > >>>>>> java.net.SocketException: Broken pipe
    > >>>>>> at java.net.SocketOutputStream.socketWrite0(Native Method)
    > >>>>>> at
    > >>>>>> java.net.SocketOutputStream.socketWrite(SocketOutputStream.java
    > >>>>>> :92)
    > >>>>>> at
    > >>>>>> java.net.SocketOutputStream.write(SocketOutputStream.java:
    > >>>>>> 136)
    > >>>>>> at java.io.BufferedOutputStream.flushBuffer(
    > >>>>>> BufferedOutputStream.java:65)
    > >>>>>> at
    > >>>>>> java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
    > >>>>>> at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:1765)
    > >>>>>> at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:1728)
    > >>>>>> at com.mysql.jdbc.MysqlIO.sendCommand (MysqlIO.java:1149)
    > >>>>>> at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1279)
    > >>>>>> at com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:1225)
    > >>>>>> at com.mysql.jdbc.Connection.execSQL(Connection.java :2278)
    > >>>>>> at com.mysql.jdbc.Connection.execSQL(Connection.java:2225)
    > >>>>>> at com.mysql.jdbc.Statement.execute(Statement.java:906)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.dba.mysql.MySQLPkGenerator.pkFromDatabase
    > >>>>>> (MySQLPkGenerator.java:123)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.dba.JdbcPkGenerator.generatePkForDbEntity
    > >>>>>> (JdbcPkGenerator.java:326)
    > >>>>>> at
    > >>>>>> org
    > >>>>>> .objectstyle
    > >>>>>> .cayenne.access.DataDomainInsertBucket.createPermIdsForObjEntity
    > >>>>>> (DataDomainInsertBucket.java:194)
    > >>>>>> at
    > >>>>>> org
    > >>>>>> .objectstyle
    > >>>>>> .cayenne.access.DataDomainInsertBucket.appendQueriesInternal(
    > >>>>>> DataDomainInsertBucket.java:122)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.access.DataDomainSyncBucket.appendQueries
    > >>>>>> (DataDomainSyncBucket.java:108)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.access.DataDomainFlushAction.preprocess(
    > >>>>>> DataDomainFlushAction.java :211)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.access.DataDomainFlushAction.flush(
    > >>>>>> DataDomainFlushAction.java:167)
    > >>>>>> at org.objectstyle.cayenne.access.DataDomain.onSyncFlush(
    > >>>>>> DataDomain.java:846)
    > >>>>>> at org.objectstyle.cayenne.access.DataDomain$2.transform(
    > >>>>>> DataDomain.java:817)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.access.DataDomain.runInTransaction(
    > >>>>>> DataDomain.java:862)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.access.DataDomain.onSync(DataDomain.java
    > >>>>>> :814)
    > >>>>>> at org.objectstyle.cayenne.access.DataContext.flushToParent(
    > >>>>>> DataContext.java:1262)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.access.DataContext.commitChanges (
    > >>>>>> DataContext.java:1166)
    > >>>>>> at com.translation.alg.WriterData.insert(WriterData.java:57)
    > >>>>>> at com.translation.alg.News.write(News.java:85)
    > >>>>>> at
    > >>>>>> com.translation.alg.TranslationNews.run (TranslationNews.java:66)
    > >>>>>> at
    > >>>>>> com.translation.alg.TranslationNews.main(TranslationNews.java:21)
    > >>>>>> ** END NESTED EXCEPTION **
    > >>>>>>
    > >>>>>>
    > >>>>>> at com.mysql.jdbc.MysqlIO.send(MysqlIO.java :1786)
    > >>>>>> at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:1728)
    > >>>>>> at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1149)
    > >>>>>> at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1279)
    > >>>>>> at com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:1225)
    > >>>>>> at com.mysql.jdbc.Connection.execSQL(Connection.java:2278)
    > >>>>>> at com.mysql.jdbc.Connection.execSQL(Connection.java:2225)
    > >>>>>> at com.mysql.jdbc.Statement.execute(Statement.java:906)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.dba.mysql.MySQLPkGenerator.pkFromDatabase
    > >>>>>> (MySQLPkGenerator.java:123)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.dba.JdbcPkGenerator.generatePkForDbEntity
    > >>>>>> (JdbcPkGenerator.java:326)
    > >>>>>> at
    > >>>>>> org
    > >>>>>> .objectstyle
    > >>>>>> .cayenne.access.DataDomainInsertBucket.createPermIdsForObjEntity
    > >>>>>> (DataDomainInsertBucket.java:194)
    > >>>>>> at
    > >>>>>> org
    > >>>>>> .objectstyle
    > >>>>>> .cayenne.access.DataDomainInsertBucket.appendQueriesInternal(
    > >>>>>> DataDomainInsertBucket.java:122)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.access.DataDomainSyncBucket.appendQueries
    > >>>>>> (DataDomainSyncBucket.java:108)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.access.DataDomainFlushAction.preprocess(
    > >>>>>> DataDomainFlushAction.java:211)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.access.DataDomainFlushAction.flush (
    > >>>>>> DataDomainFlushAction.java:167)
    > >>>>>> at org.objectstyle.cayenne.access.DataDomain.onSyncFlush(
    > >>>>>> DataDomain.java:846)
    > >>>>>> at org.objectstyle.cayenne.access.DataDomain$2.transform(
    > >>>>>> DataDomain.java:817)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.access.DataDomain.runInTransaction(
    > >>>>>> DataDomain.java:862)
    > >>>>>> at
    > >>>>>> org.objectstyle.cayenne.access.DataDomain.onSync(DataDomain.java
    > >>>>>> :814)
    > >>>>>> at org.objectstyle.cayenne.access.DataContext.flushToParent(
    > >>>>>> DataContext.java:1262)
    > >>>>>> ... 5 more
    > >>>>>> 10 Jan 2008 23:19:30,103 - INFO main
    > >>>>>> com.translation.alg.TranslationNews - [
    > >>>>>> Ljava.lang.StackTraceElement..551f60
    > >>>>>>
    > >>>>>> I do not know what it is...
    > >>>>>> sorry aout that
    > >>>>>> thanks
    > >>>>>> Marco
    > >>>>>>
    > >>>>>>
    > >>>>>> On Jan 10, 2008 12:50 PM, marco turchi < marco.turch..mail.com>
    > >>>>> wrote:
    > >>>>>>
    > >>>>>>> sorry about that... :-)
    > >>>>>>> Thanks
    > >>>>>>> Marco
    > >>>>>>>
    > >>>>>>>
    > >>>>>>> On Jan 10, 2008 12:47 PM, Andrus Adamchik <
    > >>>>>>> andru..bjectstyle.org>
    > >>>>>>> wrote:
    > >>>>>>>
    > >>>>>>>> Ah cool. I thought I was going crazy :-)
    > >>>>>>>>
    > >>>>>>>> Andrus
    > >>>>>>>>
    > >>>>>>>> On Jan 10, 2008, at 2:37 PM, marco turchi wrote:
    > >>>>>>>>
    > >>>>>>>>> Hi Andrus,
    > >>>>>>>>> sorry you are right I have added the autoReconnect to the
    > >>>>>>>>> wrong
    > >>>>>>>>> place...
    > >>>>>>>>> now the software is started, I'll see what happens at the
    > >>>>>>>>> end...
    > >>>>>>>>> thanks
    > >>>>>>>>> Marco
    > >>>>>>>>>
    > >>>>>>>>> On Jan 10, 2008 11:01 AM, marco turchi < marco.turch..mail.com
    > >>>>>>>>> >
    > >>>>>>>> wrote:
    > >>>>>>>>>
    > >>>>>>>>>> <?xml version="1.0" encoding="utf-8"?>
    > >>>>>>>>>> <driver project-version="1.1" class="com.mysql.jdbc.Driver">
    > >>>>>>>>>> <url
    > >>>>>>>>>> value="jdbc:mysql://enm-nc-srv1/subsumer?
    > >>>>>>>>>> autoReconnect=true"/>
    > >>>>>>>>>> <connectionPool min="1" max="1" />
    > >>>>>>>>>> <login userName="####" password="#####"/>
    > >>>>>>>>>> </driver>
    > >>>>>>>>>> thanks
    > >>>>>>>>>> Marco
    > >>>>>>>>>>
    > >>>>>>>>>> On Jan 10, 2008 10:51 AM, Andrus Adamchik <
    > >>>>>>>>>> andru..bjectstyle.org>
    > >>>>>>>>>> wrote:
    > >>>>>>>>>>
    > >>>>>>>>>>>
    > >>>>>>>>>>>
    > >>>>>>>>>>>
    > >>>>>>>>>>> On Jan 10, 2008, at 12:33 PM, marco turchi wrote:
    > >>>>>>>>>>>
    > >>>>>>>>>>>>>> DataSource load failed - Can not load JDBC driver named
    > >>>>>>>>>>>>>> 'com.mysql.jdbc.Driver
    > >>>>>>>>>>>>>> ?autoReconnect=true': com.mysql.jdbc.Driver?
    > >>>>>>>>>>>>>> autoReconnect=true
    > >>>>>>>>>>>
    > >>>>>>>>>>> But this is what generates an error... so somehow the driver
    > >>>>>>>>>>> name
    > >>>>>
    > >>>>>>>>>>> seems messed up. Could you post the entire file (just remove
    > >>>>>>>>>>> the
    > >>>>>>>>>>> password)?
    > >>>>>>>>>>>
    > >>>>>>>>>>> Andrus
    > >>>>>>>>>>>
    > >>>>>>>>>>>
    > >>>>>>>>>>
    > >>>>>>>>
    > >>>>>>>>
    > >>>>>>>
    > >>>>>
    > >>>>>
    > >>>>
    > >>
    > >>
    >
    >



    This archive was generated by hypermail 2.0.0 : Sun Jan 13 2008 - 05:48:06 EST