Sunitha Kambhampati (JIRA) wrote:
[ http://issues.apache.org/jira/browse/DERBY-1466?page=comments#action_12420949 ]
Sunitha Kambhampati commented on DERBY-1466:
--------------------------------------------

I took a quick look at this and want to start a discussion on how this could be solved.
Per java api for PrintWriter
-- There is no method to turn autoflush on an existing PrintWriter object.
-- when autoflush is on, flush will happen on the println statement only.

some solution options:
1) one is wrap the user's writer object with a PrintWriter and set autoflush to 
true
    -- change in code only required in two places.
    -- maybe ugly to wrap the object.

2)  explicitly call flush in all places after  we write to this writer object.
In Eclipse, searched for places where the logWriter in NetworkServerControl is referenced, here is the list
NetworkServerControlImpl - org.apache.derby.impl.drda - java/drda - ks_trunk
consoleExceptionPrintTrace(Throwable) (3 potential matches)
consoleMessage(String) (3 potential matches)
executeWork(String[]) (potential match)
setLogWriter(PrintWriter) (potential match)
shutdown() (2 potential matches)

So that is not a lot of places. so option 2 should be simple too. unless we 
miss to call flush in all the places.
------------------

There is one case where the writer is passed to exception.printStackTrace . If 
this gets flushed correctly in autoflush mode, I think #1 seems ok to me, less 
number of changes than #2.

I  was concerned a bit if setting autoflush will have any performance impact.  
But maybe it is ok since console output is not expected to be verbose anyways.

I am ok with either solution, at this point I would lean toward the 1st - assuming that console output doesn't happen very often. Would there
ever be a case where performance mattered and would only want some
of these calls autoflushed and not others?

Is there any way to determine if the existing printWriter is autoflush, if so it might be worth checking before wrapping?

Reply via email to