JSP & Oracle qstns

User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

JSP & Oracle qstns

Post by Sabina »

Заранее прошу прощения, что все в кучу, что-то у меня в последнее время до Привета добраться получается в день по 15 минут :(

1) Слышала, что несмотря на большой лимит на длину CLOB в самом Оракле, Java (якобы JDBC) накладывает ограничение в 32К.
Так ли это?

2) Верно ли утверждение, что засунуть/вытащить CLOB из базы можно только используя динамический SQL, нечто вроде:

Code: Select all

String s = ...; // a long string
String sql = "INSERT INTO comments (comment) VALUES (?)";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setCharacterStream(1, new CharArrayReader(s.toCharArray()), s.length());
pstmt.executeUpdate();

ResultSet rs = stmt.executeQuery("SELECT comment FROM comments");
rs.next();
Clob c = rs.getClob(1);
String s = new String(c.getSubString(1, (int)c.length()));


3) Как делается search по CLOB-ам. Вчера сама убедилась, что LIKE работает.

Code: Select all

SELECT * FROM questions WHERE question LIKE 'Wh%' 

А что еще?

4) Нужно сделать user session timing для JSP странички.
Из имеющихся решений:

Вставить еще один frame шириной в пиксел, добавить к body tag "onUnload" таким образом, чтобы каждый раз, когда клиент покидает страничку, шло обращение на сервер для загрузки dummy jsp в этот самый фрейм. Таким образом можно замерять время пребывания юзера на данной страничке.

А есть какие-то более простые, распространенные методы? Интересует именно JSP.

Спасибо,
Сабина
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Re: JSP & Oracle qstns

Post by vc »

Sabina wrote:Заранее прошу прощения, что все в кучу, что-то у меня в последнее время до Привета добраться получается в день по 15 минут :(

1) Слышала, что несмотря на большой лимит на длину CLOB в самом Оракле, Java (якобы JDBC) накладывает ограничение в 32К.
Так ли это?

2) Верно ли утверждение, что засунуть/вытащить CLOB из базы можно только используя динамический SQL, нечто вроде:

Code: Select all

String s = ...; // a long string
String sql = "INSERT INTO comments (comment) VALUES (?)";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setCharacterStream(1, new CharArrayReader(s.toCharArray()), s.length());
pstmt.executeUpdate();

ResultSet rs = stmt.executeQuery("SELECT comment FROM comments");
rs.next();
Clob c = rs.getClob(1);
String s = new String(c.getSubString(1, (int)c.length()));


3) Как делается search по CLOB-ам. Вчера сама убедилась, что LIKE работает.

Code: Select all

SELECT * FROM questions WHERE question LIKE 'Wh%' 

А что еще?

4) Нужно сделать user session timing для JSP странички.
Из имеющихся решений:

Вставить еще один frame шириной в пиксел, добавить к body tag "onUnload" таким образом, чтобы каждый раз, когда клиент покидает страничку, шло обращение на сервер для загрузки dummy jsp в этот самый фрейм. Таким образом можно замерять время пребывания юзера на данной страничке.

А есть какие-то более простые, распространенные методы? Интересует именно JSP.

Спасибо,
Сабина


1. No.

LOBs are accessed as streams in java. It works for LOBs of any size.

E.g.:

Code: Select all


PreparedStatement pstmt = conn.prepareStatement
             ("select clob_column from t1 where x = ?");

.........

ResultSet rs = pstmt.executeQuery();
rs.next();
Clob clob = rs.getClob(1);
InputStream is = clob.getAsciiStream();
 
byte[] my_array = new byte[...];
int length = is.read(my_array,0,...);



For writing to a LOB, you'll have to select a row for update, get the LOB OutputStream and write to it ( http://download-west.oracle.com/docs/cd ... 54/toc.htm )

2. See above.

3. The following SQL string functions are allowed with CLOBs:

INSTR INSTR
LIKE
REPLACE
CONCAT and ||
LENGTH
SUBSTR
TRIM, LTRIM and RTRIM()
LOWER, UPPER, NLS_LOWER, NLS_UPPER
LPAD and RPAD

( http://download-west.oracle.com/docs/cd ... 91/toc.htm )

However, there are obvious performance implications with lobs >= , say, 100K in size whilst using the above functions. Oracle Text would probably be a better choice for large documents.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: JSP & Oracle qstns

Post by Sabina »

vc wrote:.....However, there are obvious performance implications with lobs >= , say, 100K in size whilst using the above functions. Oracle Text would probably be a better choice for large documents.


Преогромное вам спасибо. :gen1:
Сразу направили меня в нужное русло.

Еще бы с JSP session timing (см. вопрос 4) кто-нибудь подкинул идею...

Сабина,
вся из себя благодарная.... :)
GeneDupe
Уже с Приветом
Posts: 188
Joined: 13 May 2003 00:55
Location: USA

Post by GeneDupe »

По моему если CLOB null, то сначала надо его создать используя
SET COMMENT = EMPTY_CLOB()

По поводу user session timing, надежного, а тем более стандартного способа не существует.
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

Re: JSP & Oracle qstns

Post by WildVlad »

Sabina wrote:Еще бы с JSP session timing (см. вопрос 4) кто-нибудь подкинул идею...

Могли бы поподробнее сказать, какой-такой тайминг для JSP-сессий интересует?

Если что, то тот вариант, который вы написали может не сработать, так как в onUnload пытаться сабмиттить дочерний iframe не самое лучшее занятие - если родитель выгрузился, то диты тоже вынесут :)
I hated LA
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: JSP & Oracle qstns

Post by Sabina »

WildVlad wrote:
Sabina wrote:Еще бы с JSP session timing (см. вопрос 4) кто-нибудь подкинул идею...

Могли бы поподробнее сказать, какой-такой тайминг для JSP-сессий интересует?

Если что, то тот вариант, который вы написали может не сработать, так как в onUnload пытаться сабмиттить дочерний iframe не самое лучшее занятие - если родитель выгрузился, то диты тоже вынесут :)


I mean timing for how long user is on a particular page. It doesn't matter that child frame is unloaded too. We only need a call to a server to time when main page is unloaded.

for example

Code: Select all

<%
  // page to "appear" in a 1-pixel frame
  try
  {
    // get identifying info for loaded or unloaded page in frame named "main"
    String id = session.getId(); // the session ID
    String load = request.getParameter("load"); // either this...
    String unload = request.getParameter("unload"); //...or this is not null

    // open the database connection
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection con = DriverManager.getConnection("jdbc:oracle:....", "...", "....");
    Statement stmt = con.createStatement();

    StringBuffer sql = new StringBuffer(128);
    if (load != null) // loading a page
    {
      // see if there's an open pagetimer for this page
      sql.append("SELECT timerid FROM pagetimers WHERE sessionid='").append(id).append("' AND documenturi=' ").append(load).append("' AND started IS NULL ORDER BY timerid DESC");
System.out.println(sql);
      ResultSet rs = stmt.executeQuery(sql.toString());
      if (rs.next())
        sql = null; // nothing to do
      else // add a new record
      {
        rs = stmt.executeQuery("SELECT max(timerid)+1 FROM pagetimers"); // Oracle only...
        int nextTimerId = rs.next() ? rs.getInt(1) : 1; // primary key (not auto-number) //...without auto-numbering
        sql = new StringBuffer(128);
        sql.append("INSERT INTO pagetimers (timerid,sessionid,documenturi) VALUES (").append(nextTimerId).append(",'").append(id).append("','").append(load).append("')");
    } } 
    else if (unload != null) // page is unloaded -- set ended to now
      sql.append("UPDATE pagetimers SET ended=").append(SqlUtil.getNowOracle()).append(" WHERE sessionid='").append(id).append("' AND documenturi='").append(unload).append("' AND ended IS NULL");
    if (sql != null) // execute the SQL satement
    {
System.out.println(sql);
      out.println("<!--");
      out.println(sql);
      out.println("-->");
      stmt.executeUpdate(sql.toString());
    }
    con.close();
  }
  catch(Exception e){System.out.println(e);}
  // CREATE TABLE pagetimers (timerid number primary key, documenturi varchar2(64), sessionid varchar2(32), started date default sysdate, ended date default null)
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <title>
  </title>
 </head>
 <body>
 </body>
</html>
<%@ page import='java.sql.*'%>
<%@ page import=....beans.*'%>


and the body tag string will look like this:

Code: Select all

<%
  // use in body tag for page visit monitoring
  String monitoringBody = "onLoad="parent.monitor.location='"
    + response.encodeURL("pageMonitor.jsp?load=" + request.getServletPath())
    + "'" onUnload="parent.monitor.location='"
    + response.encodeURL("pageMonitor.jsp?unload="
    + request.getServletPath()) + "'"";
%>


The other way to do this is to have 1x1 pixel applet but it's too much overhead.

I know there is no standard way to do this. I am just curious how others go around this.

Thanks,
Sabina

PS. Sorry for English. I am at work.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: JSP & Oracle qstns

Post by Sabina »

Каким типом данных Oracle можно воспользоваться, если нужен timestamp с точностью до доли секунды?

Если я правильно поняла, "Date" это точность только до секунд.

Сабина
User avatar
JustMax
Уже с Приветом
Posts: 1476
Joined: 05 Dec 2000 10:01
Location: Vilnius -> Bonn

Re: JSP & Oracle qstns

Post by JustMax »

Sabina wrote:Каким типом данных Oracle можно воспользоваться, если нужен timestamp с точностью до доли секунды?

Если я правильно поняла, "Date" это точность только до секунд.

Сабина


TIMESTAMP как ни странно :mrgreen:

Или TIMESTAMP WITH TIME ZONE - если нужно временную зону хранить для данной даты.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: JSP & Oracle qstns

Post by Sabina »

JustMax wrote:TIMESTAMP как ни странно :mrgreen:


:mrgreen: :mrgreen:

Сабина

Return to “Вопросы и новости IT”