C'è un modo per eseguire queste query come se avessi aggiunto un suggerimento (NOLOCK) a loro?Java Hibernate query HQL con nolock
risposta
Se davvero bisogno di questo, allora si vuole fare qualcosa di simile:
session.connection().setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
che è identico a un NOLOCK.
Prima di farlo, pensa davvero attentamente se vuoi fare una lettura sporca. La maggior parte delle volte le persone lo fanno perché è quello che hanno sempre fatto, piuttosto che perché è la cosa giusta da fare. In particolare, questo non funziona bene con il caching.
In realtà, this thread entra un po 'nei problemi. Leggere attentamente prima di decidere.
Nella versione più recente di Hibernate si deve fare in questo modo:
Session session = (Session) em.getDelegate();
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
}
});
Ho usato questo metodo per impostare i livelli di isolamento della transazione read_uncommitted su alcune query, ma mi sono reso conto che l'importo della connessione è stato aumentato più volte di più della quantità senza di essa. L'ammontare della connessione sul nostro server Websphere che contiene l'applicazione era 4 per un utente prima di read_uncommitted transaction e dopo è diventato come 80. È normale? O dovrei cercare qualcos'altro e da qualche altra parte per trovare il problema? – CntkCtn
Si può fare il "con (nolock)" se si va nativo. Questo è estremo ma se l'alternativa sta cambiando il livello di isolamento della transazione, potresti farlo.
Si noti che questo esempio è per MSSQL.
String sqlQueryString = "SELECT * FROM my_classes_table WITH (nolock) WHERE columnName = :columnValue";
SQLQuery sqlQuery= session.createSQLQuery(sqlQueryString).addEntity(MyClass.class);
sqlQuery.setLong("columnValue", value);
List<MyClass> out = sqlQuery.list();
Grazie, Gary. Sì, stavo cercando letture sporche. I nostri DBA hanno raccomandato NOLOCK per tutti i "seleziona" in quest'area del progetto. I problemi erano, parte degli SQL erano ibernati. – Sarit
Nelle ultime versioni di Hibernate, connection() sembra essere rimosso dall'API. Qualche idea su come un effetto simile può essere ottenuto senza oggetto di connessione? –
Se si utilizza l'annotazione '@ Transactional', può essere specificata come' isolation'-property. – Tobb